在主线程中执行Task的延续的方法

时间:2014-12-04 22:56:56

标签: c# multithreading

我必须创建一个类似于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(); 

那么我能在这做什么?

2 个答案:

答案 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();