如何在具有 2 个参数的函数上与 System.Threading.Tasks.Task 进行异步调用?在 .net 中
本文关键字:Task Tasks Threading 调用 net System 异步 参数 函数 | 更新日期: 2023-09-27 17:55:28
给定函数:
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);
显然,它无法编译。如何正确执行此操作?
首先
,我会使用 Task.Run
而不是显式创建新Task
。 然后我会await
结果,而不是阻止它完成。 这将需要将封闭方法标记为async
- 您可以在这篇博客文章中阅读有关 async/await 的更多信息。 我建议在该博客上阅读更多内容。
您可以将参数捕获为 lambda 表达式的一部分。 这部分是当前代码无法编译的原因。 这通常比 Task
构造函数中的Action<object>
重载更有用。 最终结果:
private static async Task AddAsync()
{
var result = await Task.Run(() => Add(5, 6));
Console.WriteLine("The sum is: {0}", result);
}
Task<int> t = new Task<int>(x, y => Add(x, y), 5, 6); // 5+6
您要做的是定义一个接受参数的任务,并将这些参数传递给其内部代码。
您可以使用重载,它采用object
参数来传递值,如下所示:
Task<int>.Factory.StartNew(obj => {
var arr = obj as int[];
return arr[0] + arr[1];
}, new[] { 5, 4 });