以下のサンプルと同様のバックグラウンドワーカークラスを実装しました。バックグラウンドワーカーが完了するたびにUIを更新したいと考えています。wpfで複数のバックグラウンドワーカークラスを同期するにはどうすればよいですか?
for (int i = 1; i < 10; i++)
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(Worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);
worker.RunWorkerAsync(i);
while (worker.IsBusy == true)
{
Thread.Sleep(100);
}
}
Worker_DoWork戻り値datarowおよびWorker_RunWorkerCompletedは、返された結果をデータグリッドに追加しています。関数はWorker_RunWorkerCompletedの中に適切な順序で到達することはありません。どうすればこの問題を解決できますか?
EDIT:
私は詳細で更新しています、それを明確にします。
<my:DataGrid x:Name="theGrid" RowHeight="30" ItemsSource="{Binding Category}" AutoGenerateColumns="True" HeadersVisibility="All" Margin="235,96.5,84,65.5">
<my:DataGrid.RowDetailsTemplate>
<DataTemplate>
<Expander>
<my:DataGrid Height="300" ItemsSource="{Binding Products}" AutoGenerateColumns="True" HeadersVisibility="Column"> </my:DataGrid>
</Expander>
</DataTemplate>
</my:DataGrid.RowDetailsTemplate>
</my:DataGrid>
//List of objects
List<Category> Categories = new List<Category>();
private void button1_Click(object sender, RoutedEventArgs e)
{
for (int i = 1; i < 10; i++)
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(Worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);
worker.RunWorkerAsync(i);
while (worker.IsBusy == true)
{
Thread.Sleep(100);
}
}
}
void Worker_DoWork(object sender, DoWorkEventArgs e)
{
long i = Convert.ToInt64(e.Argument);
Category cat = new Category { CategoryID = i, Name = "Category" + i };
cat.Products = new List<Product>();
for (long j = 1; j < 10; j++)
{
Product p = new Product { ProductID = (i * j), Name = "Product " + (i * j).ToString() };
cat.Products.Add(p);
}
e.Result = cat;
}
void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Category cat = ((Category)e.Result);
Categories.Add(cat);
theGrid.ItemsSource = Categories;
}
}
public class Product
{
public long ProductID { get; set; }
public string Name { get; set; }
}
public class Category
{
public long CategoryID { get; set; }
public string Name { get; set; }
public List<Product> Products { get; set; }
}
それは明確ではない - あなたが書いたコードは、UIスレッドで実行されていますか? –
「それは正しい順序で届かない」ということはどういう意味ですか –
私は、彼が最初のBWを実行してから2番目の後に、最初の結果が1秒前に来ることを保証していないと思います。 – Tigran