我们可以使用BackgroundWorker实现响应式UI。这是一个例子。
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和Dispatcher更新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上使用Asynchrony有什么好处吗?
我应该决定使用其中任何一个并且应该避免使用另一个的场景是什么。
Q.2我想了解在WPF方面使用Async - Await。就像我们离不开它们一样,现在我们可以轻松地完成它。
请指导。
答案 0 :(得分:3)
Q.1在BackgroundWorker上使用Asynchrony有什么好处吗?
当然 - 主要是代码更简单。在这种特殊情况下,你没有做任何复杂的事情,但是一旦你开始协调多个任务,拥有更复杂的控制流(循环等),想要处理错误等,它就会产生巨大的差异。
此外,在这种情况下,它会节省额外的线程 - 在第二次调用中,所有都发生在UI线程上。在更现实的例子中,您可能正在等待Web服务调用等,这绝对不需要占用额外的线程。
Q.2我想了解在WPF方面使用Async - Await。就像我们离不开它们一样,现在我们可以轻松地完成它。
从理论上讲,你可以做的所有事情都可以在没有它的情况下做到。在实践中,正确有效地编写异步代码时,锅炉板的数量偶然复杂性是一个巨大的障碍。
async / await功能允许您编写异步代码,其中看起来像,如同步代码,熟悉的控制流等。这意味着我们可以理解它,理由,并且只担心异步带来的固有复杂性,而不是编写回调等所有偶然的复杂性。