因此,当用户与窗口交互时,我尝试使用BackgroundWorker为我提取一些数据。我使用BW而不是async / await,因为该项目是在.NET 4.0中制作的,显然它必须保持这种状态。
由于某种原因,工作人员阻止主线程直到它完成,因为用户无法与窗口交互直到工作完成。
以下是我使用的代码(删除了非必要部分)
private Dictionary<string, DataSet> estadisticas;
private Dictionary<string, int> count;
private void Window_Loaded(object sender, RoutedEventArgs e) {
estadisticas = new Dictionary<string, DataSet>();
count = new Dictionary<string, int>();
BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += new DoWorkEventHandler(bg_DoWork);
bg.RunWorkerAsync();
}
private void bg_DoWork(object sender, DoWorkEventArgs e)
{
GetData();
}
private void GetData()
{
foreach (DataRowView row in DEstcli.estadisticas.Tables["tabla_propuesta"].DefaultView)
{
if (!estadisticas.ContainsKey(row.Row["CodArt"].ToString())) {
var articulo = row.Row["CodArt"].ToString();
int counter;
var res = new resumen_esta[3];
DataSet data = DEstcli.dataset(articulo, almacenes, out counter, res);
estadisticas.Add(row.Row["CodArt"].ToString(), data);
count.Add(row.Row["CodArt"].ToString(), counter);
}
}
}
稍后编辑:将BackgroundWorker更改为具有Priority.Lowest的线程会打开我的窗口,但我无法对其执行任何操作。数据网格显示但不是它们的完整宽度,由于某种原因,窗口不会完成初始化,直到线程完成。
使用调试器,我可以看到所有内容都在主线程中执行。如果我冻结主线程,它将停止获取数据。我可以看到我的帖子是用我给它的名字创建的,但它不会起作用。