C#中API中的多线程

时间:2017-08-03 16:40:34

标签: 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
    }
}

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

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,它将等待响应,并将表现为同步函数。

任何人都知道如何获得我的回复并将其还给适当的来电者?

提前谢谢! :)

2 个答案:

答案 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获得任何东西。