我必须创建一个类似于ContinueWith()
的方法,但是在主要任务之后将在主线程中执行continuation。
我该怎么做?
我可以在我的方法中无休止地检查Task
的状态,当它完成开始继续时,但我认为它不能以这种方式工作:
Task<DayOfWeek> taskA = new Task<DayOfWeek>(() => DateTime.Today.DayOfWeek);
Task<string> continuation = taskA.OurMethod((antecedent) =>
{
return String.Format("Today is {0}.", antecedent.Result);
});
// Because we endlessly checking state of main Task
// Code below will never execute
taskA.Start();
那么我能在这做什么?
答案 0 :(得分:0)
尝试传递“主”线程的Dispatcher
。例如:
Task.Factory.StartNew(()=>
{
// blah
}
.ContinueWith(task=>
{
Application.Current.Dispatcher.BeginInvoke(new Action(()=>
{
// yay, on the UI thread...
}
}
假设“主”线程是UI线程。如果不是,那么在你做完之后抓住那个线程的调度员。使用 调度程序而不是Application.Current
(即CurrentDispatcher
)。
答案 1 :(得分:0)
您可以为此类流程创建ExtensionMethod
。这是一个示例实现
static class ExtensionMethods
{
public static Task ContinueOnUI(this Task task, Action continuation)
{
return task.ContinueWith((arg) =>
{
Dispatcher.CurrentDispatcher.Invoke(continuation);
});
}
}
像这样消费。
Task run = new Task(() =>
{
Debug.WriteLine("Testing");
});
run.ContinueOnUI(() =>
{
Notify += "\nExecuted On UI"; // Notify is bound on a UI control
});
run.Start();