基于事件的异步模式实现总是捕获当前的同步上下文吗?

时间:2014-03-05 00:19:43

标签: c# winforms asynchronous

我正在查看Bart De Smet的C#5.0 Unleashed书中的一些代码,并使用WebClient进行游戏。

在下面的代码中,我注意到回调是在UI线程上执行的。我知道EAP的WebClient.DownloadStringAsync实现捕获了当前的SynchronizationContext,并且是否所有EAP实现都这样做,因为似乎没有办法指定执行回调的SynchronizationContext

以下是相关代码:

    private void loadButton_Click(object sender, EventArgs e)
    {
        var client = new WebClient();

        client.DownloadStringCompleted += (o, args) =>
            {
                if (args.Error != null)
                {
                    try
                    {
                        throw args.Error; // simply to restore structured exception handling?!
                    }
                    catch (WebException)
                    {
                        this.textBox.Text = "ERROR: " + args.Error.Message;
                    }

                    return;
                }

                // Already on the UI thread!
                this.textBox.Text = args.Result;
            };

        client.DownloadStringAsync(new Uri(@"http:\\www.rpmglobal.com"));
    }

1 个答案:

答案 0 :(得分:1)

不,绝对不是。 WebClient's实现 在您进行最终会触发事件通知您的呼叫时嗅探当前SynchronizationContext(例如DownloadStringAsync),但这纯粹是特定于实现的而不是EAP的保证。