我正在尝试使用.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
}
}
在我的主要课程中,我有:
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;
}
正如您所看到的,我希望我的函数GetResultAsync返回一个字符串,其中包含将发送给调用者的值。 但我不能有这样的东西(见下面的代码)因为GetResultAsync返回一个Task而不是一个字符串:
public string RunOrchestration(int value)
{
return r = Program.GetResultAsync(value);
}
如果我在RunOrchestration中放置await,它将等待响应,并将表现为同步函数。
任何人都知道如何获得我的回复并将其还给适当的来电者?
提前谢谢! :)
答案 0 :(得分:3)
我希望我能够以某种方式立即向世界上的每个.NET开发人员广播:async是不多线程/并行处理/后台处理等。
Async只做一件事:它允许当前线程在空闲时返回池中。而已。期。故事结局。如果您正在执行类似创建新线程的操作,那么有效地使原始线程空闲,从而允许将其返回到池中,但您仍然有一个线程。换句话说,除了为代码添加大量开销和上下文切换之外,你绝对没有做任何事情,使其更少更高效,而不是更多。
您需要的是真正的后台流程。您可以使用Hangfire之类的东西来启动任务,然后可以通过某事来处理该任务。这可能是一个控制台应用程序,另一个Web应用程序,Azure功能,等等。关键是它在您的主Web应用程序外部。然后,你可以立即返回,无需等待那件事,无论如何,完成。您还可以使用SignalR和Web worker之类的东西将状态更新推送到客户端。
答案 1 :(得分:0)
当然,GetResultAsync的返回值是Task(不是字符串)这正是应该的样子。你可能误解了await / async的概念。如果你想要字符串 - 你应该调用
#include <iostream>
using namespace std;
int addNum(int n);
int main() {
int n;
// prompt user to input numbers
cout << "Please enter in values to add together: ";
cin >> n;
cout << addNum(n);
// pause and exit
getchar();
getchar();
return 0;
}
// function
int addNum(int n) {
int arr[99] = {};
int sum = 0;
for (int i = 0; i < n; i++) {
sum = sum + arr[i];
}
return sum;
}
阅读本主题:
How and When to use `async` and `await`
然而,这样的建设是徒劳的。你没有通过async / await获得任何东西。