C# API 中的多线程

-2 c# asp.net multithreading asp.net-core asp.net-core-webapi

我正在尝试创建一个使用 .Net Core Framework 运行异步函数的 Web 服务。

这个函数必须在它自己的线程中执行并返回一个新值,该值将被发送给正确的调用者。该服务必须在我的异步函数运行时侦听其他调用,并为每个调用启动一个新线程。线程完成后,我希望将响应发送给原始调用者。我试过这种方式:

在我的控制器中,我有:

[Route("api/orchestration")]
public class OrchController : Controller
{
    [HttpGet("{value}")]
    public void RunOrchestration(int value)
    {
        Program.GetResultAsync(value); // Notice that no value is returned but it respects the asynchronicity and the multithreading as asked
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的主要课程中,我有:

public async static Task<string> GetResultAsync(int i)
{
    return await OrchestrationAsync(i);
}

public static Task<string> OrchestrationAsync(int i)
{
    return Task.Run<string>(() => { return r = Orchestration(i); });
}

public static string Orchestration(Object i)
{
    // This function is an orchestrator of microservices that talk asynchronously through a MOM 
    // Just consider that it returns the value I want in a string
    return result;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我希望我的函数 GetResultAsync 返回一个字符串,该字符串的值将发送给调用者。但是我不能有这样的东西(见下面的代码),因为 GetResultAsync 返回一个 Task 而不是一个字符串:

public string RunOrchestration(int value)
{
    return r = Program.GetResultAsync(value);
}
Run Code Online (Sandbox Code Playgroud)

如果我在 RunOrchestration 中放置了一个 await,它将等待响应并表现为一个同步函数。

任何人都知道如何获得我的回复并将其返回给正确的来电者?

提前致谢 !:)

Chr*_*att 5

我希望我能以某种方式一次向世界上的每个 .NET 开发人员广播:异步不是多线程/并行处理/后台处理等。

异步只做一件事:如果当前线程空闲,它允许将当前线程返回到池中。就是这样。时期。故事结局。如果您正在执行诸如创建新线程之类的操作,这会有效地使原始线程空闲,从而使其返回到池中,但您仍然有一个线程。换句话说,你没有绝对只不过是一群的开销和上下文切换添加到您的代码,使其效率,而不是更多。

您在这里需要的是一个真正的后台进程。您可以使用 Hangfire 之类的东西来触发任务,然后该任务可以由something处理。这可能是一个控制台应用程序、另一个 Web 应用程序、一个 Azure 函数,等等。关键是它在您的主 Web 应用程序之外。然后,你可以立即返回,无需等待那件事,不管它是什么,完成。您还可以利用 SignalR 和 Web Worker 之类的东西将状态更新推送到客户端。