如何在具有2个参数的函数上使用System.Threading.Tasks.Task进行异步调用?在.Net

时间:2015-06-11 11:48:02

标签: c# .net multithreading

给定功能:

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);  

显然,它无法编译。我该如何正确地做到这一点?

2 个答案:

答案 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 });