2014-09-11 92 views
1

我正在开发WPF应用程序。 我有一些异步工作的定时器,它们是用System.Threading.Timer对象创建的。在C#WPF应用程序中异步调用与控件的委托方法

new System.Threading.Timer(
        new System.Threading.TimerCallback(Timer_Function), 
        null, 
        timing, 
        timing 
       ); 

Timer_Function() 
{ 
    /*code that runs asynchronously */ 
} 

为了更新是在WPF查看我使用的委托方法被称为Dispatcher.Invoke否则编译器将提高InvalidOperationException异常的控制(因为不同的线程拥有它调用线程不能访问该对象。)

我的问题是委托方法不会异步运行,我必须在其中做很多工作,以便应用程序停止。

我该怎么做才能异步运行委托方法?

+1

Dispatcher.BeginInvoke – 2014-09-11 13:29:19

+0

感谢您的快速回复:-)。已经尝试过,但仍然无法正常工作。 – user3492925 2014-09-11 14:19:23

+0

Timer_Function中的代码是否真的没有运行异步? “做了很多工作”的部分在哪里? – FishySwede 2014-09-11 14:50:39

回答

0

你需要做的是独立出来的业务逻辑从显示这些计算结果的代码确定要显示的内容。业务逻辑,非UI代码应该在非UI线程中运行并计算出一些结果。那么应该给这个结果一个方法,将编组到UI线程,然后显示这些结果。

+0

是的。最后,我最终重新写了一个像你所建议的解决方案。我将代码中的所有代码放在Timer_Function(由线程运行的方法)中,并且我为每个单一操作获取/更新一个UI组件。这不是一个非常可读和舒适的解决方案(我会首选使用只是一个代表),但是...它无论如何工作。 – user3492925 2014-09-12 08:17:41

0

如果您需要程序在Timer_Function()代码运行时继续执行,则可以使用Task.Run在工作线程上执行该工作。

与平行执行一样,您需要注意同步问题。确保在处理和分派工作之前不需要结果。正如你所说的那样使用调度器可能就足够了,只要确保你认真思考。

喜欢的东西:

Timer_Function() 
{ 
    Task.Run(() => 
    { 
      /* do your work here */ 
    }); 
} 

很抱歉,如果我误解你的问题

+0

他不需要代码就可以将工作移动到非UI线程。他*在非UI线程中启动*。 – Servy 2014-09-11 15:30:04

0

对于异步任务,使用此 -

Task.Factory.StartNew(() => 
{ 
    // Code which needs to run asynchronously 
}.ContinueWith(task => 
    { 
     Application.Current.Dispatcher.Invoke(new Action(() => 
     { 
      // Code in which you are updating UI 
     }); 
    } 
+0

他不需要代码就可以将工作移动到非UI线程。他*在非UI线程中启动*。 – Servy 2014-09-11 15:31:37