从任务更新 GUI
Update GUI from Task
我正在尝试创建一个方法来封装来自不同线程的所有 GUI 操作,但是当我使用它时没有任何反应也没有抛出异常。
这是我得到的:
private Task t1;
private void Button_Click(object sender, RoutedEventArgs e)
{
t1 = Task.Factory.StartNew(() => DoStuffInTask())
.ContinueWith(tsk => Finished(tsk));
}
private void DoStuffInTask()
{
//doing important stuff...
for (int i = 0; i < Int16.MaxValue; i++)
{
//Text is a property that raises INotifyPropertyChanged event
RunOnGui(() => { Text = i.ToString(); }); // not working, not throwing exception
Application.Current.Dispatcher.Invoke(() => Text = i.ToString()); // works fine
}
}
private void RunOnGui(Action action)
{
Application.Current.Dispatcher.Invoke(() => action);
}
这一行
Application.Current.Dispatcher.Invoke(() => action);
编译到重载 public TResult Invoke<TResult>(Func<TResult> callback);
您的代码正在执行 Func<Action>
只是 returns 操作,而不是执行它。
你需要的是这个
private void RunOnGui(Action action)
{
Application.Current.Dispatcher.Invoke(action);//Note no lambda here
}
我正在尝试创建一个方法来封装来自不同线程的所有 GUI 操作,但是当我使用它时没有任何反应也没有抛出异常。
这是我得到的:
private Task t1;
private void Button_Click(object sender, RoutedEventArgs e)
{
t1 = Task.Factory.StartNew(() => DoStuffInTask())
.ContinueWith(tsk => Finished(tsk));
}
private void DoStuffInTask()
{
//doing important stuff...
for (int i = 0; i < Int16.MaxValue; i++)
{
//Text is a property that raises INotifyPropertyChanged event
RunOnGui(() => { Text = i.ToString(); }); // not working, not throwing exception
Application.Current.Dispatcher.Invoke(() => Text = i.ToString()); // works fine
}
}
private void RunOnGui(Action action)
{
Application.Current.Dispatcher.Invoke(() => action);
}
这一行
Application.Current.Dispatcher.Invoke(() => action);
编译到重载 public TResult Invoke<TResult>(Func<TResult> callback);
您的代码正在执行 Func<Action>
只是 returns 操作,而不是执行它。
你需要的是这个
private void RunOnGui(Action action)
{
Application.Current.Dispatcher.Invoke(action);//Note no lambda here
}