我们可以使用BackgroundWorker实现响应式用户界面。这里是例子。BackgroundWorker和异步比较
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Thread test = new Thread(new ThreadStart(TestThread));
test.Start();
}
private void TestThread()
{
for (int i = 0; i <= 1000000000; i++)
{
Thread.Sleep(1000);
Dispatcher.Invoke(
new UpdateTextCallback(this.UpdateText),
new object[] { i.ToString() }
);
}
}
private void UpdateText(string message)
{
Tests.Add(message);
}
public delegate void UpdateTextCallback(string message);
private ObservableCollection<string> tests = new ObservableCollection<string>();
public ObservableCollection<string> Tests
{
get { return tests; }
set { tests = value; }
}
UI:
<StackPanel>
<Button Content="Start Animation" Click="Button_Click" />
<Button Content="Start work" Click="Button_Click_1" />
<Rectangle Name="rec1" Fill="Red" Height="50" Width="50"/>
<ListView ItemsSource="{Binding Tests}" ScrollViewer.CanContentScroll="True" />
</StackPanel>
在这里,我可以启动动画,并在同一时间,我可以更新使用BackgroundWorker与调度员的UI。
同样的事情,我可以通过异步像这样实现:
private async void GetTests(ObservableCollection<string> items)
{
for (int i = 0; i < 20; i++)
{
var s = await GetTestAsync(i);
items.Add(s);
}
}
async Task<string> GetTestAsync(int i)
{
await Task.Delay(2000);
return i.ToString() + " Call - " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString();
}
Q.1是否有使用非同步过的BackgroundWorker的任何优势?
什么情况下我应该决定使用他们中的任何一个,并应避免使用其他。
Q.2我想了解使用WPF中的Async -Await。就像没有它我们不能做的那样,现在我们可以轻松地做到这一点。
请指导。
它的梦想成真......乔恩的飞碟回答了我的问题......非常感谢您的时间。用Async编写WPF响应式UI的文章,但没有找到不使用BackgroundWorker的原因。任何提示无需比较即可继续。你是最好的人。你让我的星期天...... –
好吧,选项通常是:1)做事异步,不浪费线程。2)使用另一个线程(不管是否是BackgroundWorker)同步执行工作并浪费线程,*和*必须在每次要更新UI或从其获取输入时重新发送到UI。 –
感谢Jon的建议。现在我知道正确使用异步... –