WPF中的线程化

时间:2012-01-02 12:02:38

标签: c# wpf multithreading thread-safety threadpool

我有这样的程序

private void  do_my_method_click(object sender, RoutedEventArgs e)
{  
      //there are some variables and methods here

      //works fine
      ThreadPool.QueueUserWorkItem(Start_method);  

      // when added gives error this thread owned by other thread
      ThreadPool.QueueUserWorkItem(Start_method_2);
}

Start_method(object state)
{
}

Start_method_2(object state)
{
}
<{1}}的{​​{1}}的输出用于Start_method我不确切地知道我哪里出错了,我是WPF和C#的新手。

2 个答案:

答案 0 :(得分:1)

正如@Tudor建议的那样,在Start_method_2内你正在修改我认为的GUI。

如果要在主线程上工作的UI上修改某些内容,请使用System.Threading.SynchronizationContext.Current。这是一个例子:

var sync = System.Threading.SynchronizationContext.Current;

sync.Post(x => { 

    TextBlock1.Text = "Foo";

}, null);

这段代码是安全的,但是它遗漏了很多(异常处理等)。这也是我遇到类似问题的另一个问题,当我知道线程稍微有些问题时:

Simple Async operation with Continuation scenario doesn't work on a WPF app

答案 1 :(得分:0)

如果在第二种情况下使用方法1的输出,则存在竞争条件的危险。

异常可能是由访问worker中的UI控件引起的。向我们展示方法,以便我们提供更详细的解决方案。