2012-02-14 54 views
1

我测试异步例子,我在其他帖子中写道,我修改了它显示一个文本框一些信息。接下来发生的事情我没有预料到。我不知道为什么它从另一个线程修改控件时不会抛出异常。我瞎了还是为什么我看不到?为什么这个异步的例子没有Dispatcher或Control.BeginInvoke?

这里的例子,它的工作原理相同的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

+0

如果你运行它的话,你会得到一个问题。这似乎是“随机的”。 – 2012-02-14 21:16:03

+0

是的,我测试过,点击超过150次,它会失败,那么现在的问题是,为什么要花太长时间才能失败? – montelof 2012-02-14 21:31:02

+0

也许你实际上是在做什么,有击中问题的可能性很小,因为没有多少人与UI发生时更新来自于可顺便。 150中的1是非常高的失败率。 – 2012-02-14 21:35:00

回答

1

实际的答案,为什么你的代码不能在你期望的方式失败的是,WebClient调用UI线程上的事件。因此,你不会像你想象的那样,在不同的线程上修改你的控制权。

+0

是的,这说明了一切... – montelof 2012-02-15 00:12:47

+0

我刚才读的只有两个clases执行的主线是BackgroundWorker的和WebClient的事件。谢谢。我开始认为我正在进入另一个维度,线程可以修改主线程的控制。 – montelof 2012-02-15 00:20:35

相关问题