在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);
}
}
请注意下面的陈述:
示例表明异步任务在与主应用程序线程不同的线程上执行。
因此,如果您希望任务在主应用程序线程上运行,请参阅答案,作者为@StephenCleary。
关于任务运行的线程,请注意Stephen在他的答案中发表的评论:
您可以使用简单的Wait
或Result
,这样做没有问题。但是请注意两个重要的区别:1)所有async
继续运行在线程池而不是主线程上,2)任何异常都包装在AggregateException
中。
(请参见
任务并行库中的异常处理,了解如何加入异常处理以处理
AggregateException
。)
最后,在Task.Delay Method (TimeSpan)的MSDN文档中,这个例子展示了如何运行一个返回值的异步任务:
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);
}
}
请注意,您可以像这样传递lambda函数而不是将代理传递给Task.Run:
(注意,在lambda函数中添加您需要运行的代码)
var t = Task.Run(async () =>
{
await Task.Delay(TimeSpan.FromSeconds(1.5));
return 42;
});