我正在做一些操作,比如读取csv文件并转换为对象。它的工作正常,除了busyindicator.Isbusy = true之外,BusyIndicator不可见;
所有内容都在主线程上运行,所以我想当我读取文件时,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会显示busyIndicator,而在后台运行如读取csv和转换为对象的操作
我尝试过使用BackgroundWorkerThread,但是它是一个异步的,所以还有其他方法可以实现吗?
问候
答案 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;
此致