如何在具有 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);  

显然,它无法编译。如何正确执行此操作?

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

首先

,我会使用 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 });
相关文章: