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

C# 如何使用System.Threading.Tasks.Task对具有2个参数的函数进行异步调用?在.Net中,c#,.net,multithreading,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 => Ad

给定函数:

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 t=新任务(x,y=>Add(x,y),5,6);//5+6
t、 Start();
t、 等待();
//获取结果(result属性内部调用Wait)
Console.WriteLine(“总和为:+t.Result”);

很明显,它不能被编译。如何正确执行此操作?

首先,我将使用
任务。运行
而不是显式创建新的
任务。然后我将等待结果,而不是阻塞,直到它完成。这需要将封闭方法标记为
async
——您可以在中阅读有关async/await的更多信息。我建议在那个博客上多读一些

可以将参数捕获为lambda表达式的一部分。这部分就是当前代码无法编译的原因。这通常比
任务
构造函数中的
操作
重载更有用。最终结果是:

private static async Task AddAsync()
{
    var result = await Task.Run(() => Add(5, 6));
    Console.WriteLine("The sum is: {0}", result);
}

错误1“await”运算符只能在异步方法中使用。考虑将此方法标记为“AsiNC”修饰符并将其返回类型改为“任务”。错误2“Stult.thord.Task.Tebug”不包含“Run”C:\Studio csies的定义,您需要添加<代码> AsYNC <代码>(如它所建议的),以便使用<代码>等待< /代码>。你可能想读(还有更多的博客!)<代码>任务.Run
在.NET 4.5-您使用的是什么?.NET 4.5.5。。如何将async添加到enclocing方法中?这是一个开始,但使用
Result
时,您只是在等待另一个线程时阻塞,这会使它变得有点无意义。-错误3参数1:无法从'int[]转换“to”System.Threading.Tasks.TaskScheduler”-错误2“System.Threading.Tasks.Task.Start(System.Threading.Tasks.TaskScheduler)”的最佳重载方法匹配具有一些无效参数-错误1委托“System.Func”不接受1arguments@user3037960再次抱歉!!我没有使用VisualStudio,也没有手动编写。现在试试有两个基本错误-一个是,定义具有多个参数的匿名委托需要使用括号,例如,
(x,y)=>Add(x,y)
;另一个是,没有超负荷的
新任务
占用您尝试传递的
函数。不过,这并没有什么坏处-您可以直接捕获参数-
()=>添加(5,6)
。实际上没有什么理由以任何其他方式传递参数……对于任务框架还有一个常见的误解:任务不一定使用多线程!您可能需要
Task.Run(…)
执行长时间运行的操作,如磁盘订单数据库IO。请参阅,以了解详细的概述。
Task<int> t = new Task<int>(x, y => Add(x, y), 5, 6); // 5+6
Task<int>.Factory.StartNew(obj => {
            var arr = obj as int[];
            return arr[0] + arr[1];
}, new[] { 5, 4 });