2014-12-04 51 views
0

我必须创建一个类似于ContinueWith()的方法,但会在主任务后执行主线程中的继续。在主线程中执行任务的继续的方法

我该怎么做? 我可以无休止地检查Task状态在我的方法,当它完成开始延续,但我认为这couldn`t以这样的方式工作:

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

定义“主线程”。为什么不能只写一个常规的'async'方法?请参阅http://stackoverflow.com/help/mcve以了解什么样的代码示例实际上是一个很好的代码示例。 – 2014-12-04 22:59:11

+1

线程A应创建一个AutoResetEvent,并在它创建线程B时将它的引用传递给线程B,然后等待AutoResetEvent。线程B在完成其工作时应该“设置”线程A正在等待的AutoResetEvent。 – RenniePet 2014-12-05 00:03:08

+0

@PeterDuniho:更合适的问题是,您运行的是哪个版本的.NET?异步/等待是4.5语法。 – code4life 2014-12-05 01:56:06

回答

0

尝试传递“主”线程的Dispatcher。例如:

Task.Factory.StartNew(()=> 
{ 
    // blah 
} 
.ContinueWith(task=> 
{ 
    Application.Current.Dispatcher.BeginInvoke(new Action(()=> 
    { 
     // yay, on the UI thread... 
    } 
} 

假设“主”线程是UI线程。如果不是,那么在完成后抓住该线程的调度器。使用调度器而不是Application.Current(即CurrentDispatcher)。

+0

“继续应该照顾你”行显示不正确。 – 2014-12-05 03:02:11

+0

默认情况下,继续会在'TaskScheduler.Current'上执行,除非您正在从另一个任务的内部安排继续,否则为'TaskScheduler.Default'。这意味着在大多数情况下,无论哪个线程开始执行任务,哪个线程都执行了原来的“ContinueWith”调用,延续将在线程池上执行。如果你希望继续被发回到适当的'SynchronizationContext',你总是需要使用'TaskScheduler.FromCurrentSynchronizationContext()'。 – 2014-12-05 03:02:40

+0

感谢您的澄清!我错过了这个微妙之处。根据msdn的说法:'延续本身就是一项任务,并不会阻塞它启动的线程。使用Wait方法阻塞,直到继续任务结束。# – code4life 2014-12-05 05:29:20

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(); 
+0

看起来像我所需要的,但如果我明白我的任务权利,我不能使用ContinueWith,它必须是我自己的方法...( – progerz 2014-12-05 08:53:03

+0

@progerz这就是你传递你的Action委托的地方 – DevEstacion 2014-12-06 00:32:45

相关问题