C# 异步调用接受字符串并在C中返回int的方法#
假设您有一个如下所示的方法:C# 异步调用接受字符串并在C中返回int的方法#,c#,asynchronous,async-await,C#,Asynchronous,Async Await,假设您有一个如下所示的方法: public int slowMethod(string ss) { Console.WriteLine("slow method exec starts"); //Do some time taking work Thread.Sleep(3000); Console.WriteLine("slow method exec ends");
public int slowMethod(string ss)
{
Console.WriteLine("slow method exec starts");
//Do some time taking work
Thread.Sleep(3000);
Console.WriteLine("slow method exec ends");
return 1;
}
您必须异步调用此方法,但不能更改此方法的签名,那么您将如何执行此操作?创建一个包装类,如下所示:
public async void slowMethodAsync()
{
string ss=“my string value”;//或从slowMethodAsync的调用方传递值
Task T=Task.Run(()=>{
返回速度法(ss);
});
var res=等待任务。WhenAll(T);
WriteLine($“res[0]的值:{res[0]}”);
}
并从Main
方法调用slowMethodAsync
,如下所示:
static void Main(字符串[]args)
{
Console.WriteLine(“主方法开始”);
slowMethodAsync();
Console.WriteLine(“主方法端”);
}
控制台输出:
main method begins
slow method exec starts
main method end
//after 3 seconds
slow method exec ends
value of res[0]:1
当有多个需要异步运行的
slowMethod
时,它将更加有效。您还可以编写var res=wait Task.run…
。另外,在问题中,如果您想Task.Delay(500)
生效,必须等待它。@MichałTurczyn是的,我们可以,但我使用了WhenAll()
,这样我们就可以调用多个slowmethods。此外,异步方法应该在可能的情况下返回Task
。@MichałTurczyn将代码更改为使用Thread.Sleep()
。谢谢。请不要async void
(除非您知道它仅用作顶级事件处理程序)。这可能会意外破坏整个应用程序的一个小示例:@MindSwipe实际上在这个问题上,Foo
方法很简单,它不接受或返回任何值。我面临着这个挑战,所以决定发布一个新的答案,其中包含一个接受并返回值的方法。答案的核心概念是“不要这样做。从同步更改为异步将不可避免地带来API更改”。此外,链接问题中的方法确实返回一个值,添加一个parameter@MindSwipe我只是在C#中的一个控制台应用程序中玩异步代码,在一次采访中有人问我这个问题,所以我想在这里发布一个答案。如果需要在另一个线程中运行同步方法,请使用Task.run()=>慢方法(“”)
,就这么简单。