在MSDN上,Task的文档。Run Method (Action)提供了这个例子,展示了如何从main异步运行一个方法:
using System;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
ShowThreadInfo("Application");
var t = Task.Run(() => ShowThreadInfo("Task") );
t.Wait();
}
static void ShowThreadInfo(String s)
{
Console.WriteLine("{0} Thread ID: {1}",
s, Thread.CurrentThread.ManagedThreadId);
}
}
// The example displays the following output:
// Application thread ID: 1
// Task thread ID: 3
请注意下面的例子:
这些例子表明异步任务执行在不同的
线程比主应用程序线程多。
因此,如果您希望任务在主应用程序线程上运行,请参阅@StephenCleary的回答。
关于任务运行的线程,也请注意Stephen对他的回答的评论:
您可以使用简单的Wait或Result,没有任何问题
的。但要注意两者之间有两个重要的区别:
所有异步延续都运行在线程池上,而不是主线程池上
2)任何异常都包装在AggregateException中。
(参见异常处理(任务并行库)了解如何合并异常处理来处理AggregateException。)
最后,从MSDN上的任务文档。延迟方法(TimeSpan),这个例子展示了如何运行一个返回值的异步任务:
using System;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
var t = Task.Run(async delegate
{
await Task.Delay(TimeSpan.FromSeconds(1.5));
return 42;
});
t.Wait();
Console.WriteLine("Task t Status: {0}, Result: {1}",
t.Status, t.Result);
}
}
// The example displays the following output:
// Task t Status: RanToCompletion, Result: 42
注意,不是传递一个委托给Task。运行时,你可以像这样传递一个lambda函数:
var t = Task.Run(async () =>
{
await Task.Delay(TimeSpan.FromSeconds(1.5));
return 42;
});