我是C#的新手,我正在尝试一些例子。我有下面的代码。
public async Task<string> RunSlowOperation()
{
Console.WriteLine("Running the slow operation on thread id {0}",
Thread.CurrentThread.ManagedThreadId);
await Task.Delay(3000);
Console.WriteLine("Slow operation about to finish with thread id {0}",
Thread.CurrentThread.ManagedThreadId);
return "This operation is very slow";
}
在我的main函数中,我使用Task调用此异步方法,但收到错误:
Operation op = new Operation();
Task<string> t = new Task<string>(() => op.RunSlowOperation());
上面显示的错误:
无法将lambda表达式转换为'string'类型,因为它不是a 委托类型不能隐式转换类型
'System.Threading.Tasks.Task<string>'
到'string'
答案 0 :(得分:2)
RunSlowOperation
返回Task<string>
。当您实例化Task
时,告诉编译器返回类型是string
,它不是,因此编译器会对你大吼大叫。
你有几个选择来实现你想要的。首先是告诉编译器您要返回Task<Task<string>>
而不是Task<string>
:
Task<Task<string>> t = new Task<Task<string>>(() => RunSlowOperation());
另一个,这似乎更像是我实际尝试做的事情,只是在await
上RunSlowOperation
:
public async Task FooAsync()
{
string result = await RunSlowOperation();
Console.WriteLine(result);
}
第三,将使用Task.Run
而不是new Task
,这是在使用TPL时将工作排队到线程池的推荐方法。 Task.Run
知道异步委托并将为您解开内部任务,而无需自己执行,因此编译器允许将其分配给Task<string>
:
Task<string> x = Task.Run(() => RunSlowOperation());
如果你想异步地等待它:
string t = await Task.Run(() => RunSlowOperation());
答案 1 :(得分:2)
为什么要在主函数中创建新任务?您已经可以等待已创建的Task方法。
只需在您的主要功能中执行此操作:
Operation op = new Operation();
string t = await op.RunSlowOperation();
不要忘记让你的主要功能 async
答案 2 :(得分:1)
您必须等待主要方法。
Operation op = new Operation();
Task<string> t = await op.RunSlowOperation();
但是等待Main中的方法是一种不好的做法,而不是创建像这样的方法
static async void MyMethod()
{
Operation op = new Operation();
Task<string> t = await op.RunSlowOperation();
}
然后从Main方法调用此方法。有关详细信息,请参阅 https://msdn.microsoft.com/en-us/library/hh191443.aspx
https://msdn.microsoft.com/en-us/library/hh191443.aspx和 begginer有很好的视频。 https://www.youtube.com/watch?v=iMcycFie-nk