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()=>慢方法(“”)
,就这么简单。