为什么这个异步示例在没有Dispatcher和Control.BeginInvoke的情况下工作?

时间:2012-02-14 21:09:05

标签: winforms silverlight asynchronous thread-safety

我正在测试我在其他帖子中写过的异步示例,我修改它以在文本框中显示一些信息。接下来发生了什么,我没想到。我不知道为什么从另一个线程修改控件时它不会抛出异常。我是盲人还是为什么我没有看到它?

这是一个例子,它对silverlight和WinForms也是一样的:

    int rand=0;
    public MainPage()
    {
        InitializeComponent();
    }

    public Func<Action<int, int>, Action<int>> DownloadDataInBackground = (callback) =>
    {
        return (c) =>
        {
            WebClient client = new WebClient();
            Uri uri = new Uri(string.Format("https://www.google.com/search?q={0}", c));
            client.DownloadStringCompleted += (s, e2) =>
            {
                callback(c, e2.Result.Length);
            };
            client.DownloadStringAsync(uri);
        };
    };

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        int callid = rand++;
        Debug.WriteLine("Executing CallID #{0}", callid);
        DownloadDataInBackground((c3, r3) =>this.textBox1.Text+=string.Format("The result for the callid {0} is {1} \n", c3, r3))(callid);
    }

快速点击按钮,它不会失败。

非常感谢您的帮助。

编辑:添加图片显示Windows窗体始终从主线程执行控件修改,但是,为什么如果它应该是另一个呢? winfors mainthread

1 个答案:

答案 0 :(得分:1)

为什么你的代码没有以你期望的方式失败的实际答案是WebClient在UI线程上调用它的事件。因此,您似乎没有像想象的那样在不同的线程上修改控件。