0

我们可以使用 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; }
    }

用户界面:

<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 相比,使用异步有什么优势吗?

在哪些情况下我应该决定使用其中任何一种并避免使用另一种。

Q.2 我想了解 WPF 中 Async - Await 的使用。就像我们没有它不能做的事情一样,现在我们可以很容易地用它来做。

请指导。

4

1 回答 1

3

Q.1 与 BackgroundWorker 相比,使用异步有什么优势吗?

当然——首先,代码要简单得多。在这种特殊情况下,您并没有做任何复杂的事情,但是一旦您开始协调多个任务,拥有更复杂的控制流(循环等),想要处理错误等,就会产生巨大的差异。

此外,在这种情况下,它节省了一个额外的线程 - 在您的第二次调用中,一切都发生在 UI 线程上。在更现实的示例中,您可能正在等待 Web 服务调用等,这绝对不需要占用额外的线程。

Q.2 我想了解 WPF 中 Async - Await 的使用。就像我们没有它不能做的事情一样,现在我们可以很容易地用它来做。

理论上,你可以用 async 做的所有事情,如果没有它,你也可以做。在实践中,样板代码的数量以及正确有效地编写异步代码的偶然复杂性是一个巨大的障碍。

async/await 功能让您可以编写看起来像同步代码的异步代码,具有熟悉的控制流等。这意味着我们可以理解它,推理它,并且只担心异步带来的固有复杂性,而不是所有附带的编写回调等的复杂性。

于 2012-09-09T07:22:52.113 回答