Task.Factory.StartNew(() Wait() this.Dispatcher.BeginInvoke(new Action(() 用法
时间: 2024-04-04 09:30:56 浏览: 156
这两个语法都是用于在多线程中更新UI界面的方法。
`Task.Factory.StartNew(() => Wait())` 是使用Task类的方法来启动一个新的线程,然后在该新线程上执行Wait()方法,而不会阻塞主线程,从而使UI界面保持响应性。
`this.Dispatcher.BeginInvoke(new Action(() => ...))` 则是使用WPF程序中的Dispatcher对象来将UI操作调度到UI线程上执行,以避免在非UI线程上更新UI界面所导致的异常。其中,new Action(() => ...)表示要执行的UI操作,而this.Dispatcher则表示当前UI界面的Dispatcher对象。
相关问题
private void btn_f_stop_Click(object sender, RoutedEventArgs e) { this.IsEnabled = false; //启动等待动画 Task ts = Task.Factory.StartNew(() => { for (int i = 0; i < gSlotCnt; i++) { //gWorkFlowManger[i].WaitFor(); gWidPannels[i].Stop(); } var completed = new Action(() => { //关闭动画 this.IsEnabled = true; }); this.Dispatcher.Invoke(completed); }); this.btn_start.IsEnabled = true; }
这段代码是一个WPF应用程序中的事件处理方法,用于处理“btn_f_stop”按钮的点击事件。该方法内部定义了一个异步任务(Task),并在启动该任务之前禁用了当前窗口的所有控件。
在异步任务中,使用了一个for循环来遍历gSlotCnt个元素,每个元素对应一个gWidPannels[i]控件的实例,并调用它的Stop()方法。在循环执行结束后,定义了一个名为completed的委托,用于在当前线程中执行一些操作。在completed委托中,通过Dispatcher对象的Invoke()方法调用了一个Action委托,用于在主线程中重新启用所有控件。
最后,该方法设置了“btn_start”按钮的IsEnabled属性为true,用于重新激活该按钮。
this.Dispatcher.BeginInvoke使用
this.Dispatcher.BeginInvoke 方法是用于在 WPF 或者 WinForms 应用程序中将一个操作调度到 UI 线程上执行的方法。由于 UI 线程是单线程的,如果在非 UI 线程上执行 UI 操作,就会抛出异常或者导致程序崩溃。因此,使用 BeginInvoke 方法可以确保操作在 UI 线程上执行,避免线程冲突和异常。
该方法的语法如下:
```
public DispatcherOperation BeginInvoke(Delegate method, params object[] args);
```
其中,method 参数是一个委托,它指定要在 UI 线程上执行的操作;args 参数是一个可选的数组,它包含要传递给方法的参数。
BeginInvoke 方法将操作加入到 UI 线程的队列中,然后返回一个 DispatcherOperation 对象,该对象可以用于跟踪操作的状态、取消操作或者等待操作完成。
阅读全文