给定功能:
private static int Add(int x, int y)
{
Console.WriteLine("Add() invoked on thread {0}.",
Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(500);
return x + y;
}
我试过了:
Task<int> t = new Task<int>(x, y => Add(x, y), 5, 6); // 5+6
t.Start();
t.Wait();
// Get the result (the Result property internally calls Wait)
Console.WriteLine("The sum is: " + t.Result);
显然,它无法编译。我该如何正确地做到这一点?
答案 0 :(得分:3)
首先,我使用Task.Run
而不是明确创建新的Task
。然后我await
结果而不是阻塞直到它完成。这将需要将封闭方法标记为async
- 您可以在this blog post中阅读有关async / await的更多信息。我建议在该博客上阅读更多内容。
您可以将参数捕获为lambda表达式的一部分。这部分是您当前代码无法编译的原因。这通常比Action<object>
构造函数中的Task
重载更有用。最终结果:
private static async Task AddAsync()
{
var result = await Task.Run(() => Add(5, 6));
Console.WriteLine("The sum is: {0}", result);
}
答案 1 :(得分:0)
Task<int> t = new Task<int>(x, y => Add(x, y), 5, 6); // 5+6
你要做的是定义一个接受参数的Task,并将这些参数传递给它的内码。
您可以使用带有object
参数的重载来传递值,如下所示:
Task<int>.Factory.StartNew(obj => {
var arr = obj as int[];
return arr[0] + arr[1];
}, new[] { 5, 4 });