BusyIndi​​cator不可见?

时间:2015-11-04 05:53:58

标签: c# wpf multithreading

我正在做一些操作,比如读取csv文件并转换为对象。它的工作正常,除了busyindicator.Isbusy = true之外,BusyIndi​​cator不可见;

所有内容都在主线程上运行,所以我想当我读取文件时,UI或主线程可能会忙,因此它不可见。

代码:

    private void ImportData(Dictionary<string, ImportFieldMap> mappedItems)
    {

        var fileBytes = fileBrowseCtrl.FileBytes;
        var getDelimiter = string.IsNullOrEmpty(txeSeperator.Text) ? UtilFunctions.GetDefaultDeLimiter() : txeSeperator.Text.ToCharArray()[0];
        if (fileBytes == null)
        {
            MessageBox.Show(Uniconta.ClientTools.Localization.lookup("NoFilesSelected"), Uniconta.ClientTools.Localization.lookup("Error"), MessageBoxButton.OK);
            return;
        }
        Encoding Coding = Encoding.Unicode;
        if (ANSICodePage.IsUTF8(fileBytes))
            Coding = Encoding.UTF8;
        else if (ANSICodePage.IsANSI(fileBytes))
        {
            fileBytes = ANSICodePage.Convert2Unicode(fileBytes);
            Coding = Encoding.Unicode;
        }

        try
        {
            busyIndicator.IsBusy = true;
            CSVHelper csvData;
            using (var reader = new StreamReader(new MemoryStream(fileBytes), Coding, true))
            {
                csvData = CSVHelper.Load(reader, getDelimiter);
            }
            //Converting to UnicontaObject Code...
        }
        catch
        {
            MessageBox.Show(Uniconta.ClientTools.Localization.lookup("InvalidFileFormat"), Uniconta.ClientTools.Localization.lookup("Error"), MessageBoxButton.OK);
            fileBrowseCtrl.ResetControl();
        }
        finally
        {
            busyIndicator.IsBusy = false;
        }
    }

有没有办法可以在不同的线程上单独运行,这样当调用该函数时,UI会显示busyIndi​​cator,而在后台运行如读取csv和转换为对象的操作

我尝试过使用BackgroundWorkerThread,但是它是一个异步的,所以还有其他方法可以实现吗?

问候

1 个答案:

答案 0 :(得分:0)

<强> 1。 Multihreading

1.1 BackgroungWorker很好。

1.2。另一种选择是使用Dispatcher

每个WPF组件都有一个Dispatcher,您可以使用它来返回GUI线程:

// Get the dispatcher on the Gui thread
Dispatcher dispatcher = window.Dispatcher;

// use it on the worker thread to get back to GUI thread
dispatcher.Invoke( 
  () =>{
    busyIndicator.IsBusy = true;
);

<强> 2。更新GUI

您没有更改GUI的原因可能是您的GUI属性不会引发任何事件。

public bool IsBusy{
    get{ return isBusy; }
    set{ 
       isBusy = value;
       FirePropertyChange();
    }
}

INotifyPropertyChanged应该在持有IsBusy属性的类上实现:

public class User : IDataErrorInfo, INotifyPropertyChanged
{
    private void OnNotifyPropertyChange([CallerMemberName]string propName = null)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
    public event PropertyChangedEventHandler PropertyChanged;

此致