-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,它将等待响应并表现为一个同步函数。
任何人都知道如何获得我的回复并将其返回给正确的来电者?
提前致谢 !:)
我希望我能以某种方式一次向世界上的每个 .NET 开发人员广播:异步不是多线程/并行处理/后台处理等。
异步只做一件事:如果当前线程空闲,它允许将当前线程返回到池中。就是这样。时期。故事结局。如果您正在执行诸如创建新线程之类的操作,这会有效地使原始线程空闲,从而使其返回到池中,但您仍然有一个线程。换句话说,你没有绝对只不过是一群的开销和上下文切换添加到您的代码,使其少效率,而不是更多。
您在这里需要的是一个真正的后台进程。您可以使用 Hangfire 之类的东西来触发任务,然后该任务可以由something处理。这可能是一个控制台应用程序、另一个 Web 应用程序、一个 Azure 函数,等等。关键是它在您的主 Web 应用程序之外。然后,你可以立即返回,无需等待那件事,不管它是什么,完成。您还可以利用 SignalR 和 Web Worker 之类的东西将状态更新推送到客户端。
| 归档时间: |
|
| 查看次数: |
4159 次 |
| 最近记录: |