2017-08-03 29 views
-2

我想创建一个与.Net核心框架运行异步函数的Web服务。在C中的API多线程#

该函数必须在其自己的线程中执行并返回一个新的值,该值将被发送给适当的调用者。 服务必须在异步函数运行时监听其他调用,并为每个调用启动一个新线程。 一旦线程完成,我希望将响应发送给原始调用者。 我已经试过这样:

在我的控制,我有:

[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返回一个任务,而不是一个字符串:

public string RunOrchestration(int value) 
{ 
    return r = Program.GetResultAsync(value); 
} 

如果我把一个地等待着RunOrchestration,它会等待响应,并表现作为同步功能。

任何人都有一个想法,如何得到我的回应,并将其返回给适当的来电者?

提前致谢! :)

+0

阅读SignalR – Nkosi

+1

async!=并行执行 – Tseng

+1

当我的异步函数正在运行时,该服务必须监听其他调用,并为每个调用启动一个新线程 - >您确实知道调用是并发处理的除非你故意禁用了这个功能?那么为什么这种结构? –

回答

0

当然,GetResultAsync的返回值是任务(不是字符串)这正是它应该是。您可能误解了await/async的概念。如果你想字符串 - 你应该叫

await Program.GetResultAsync(value) 

阅读本主题:

How and When to use `async` and `await`

然而,这种结构是徒劳的。你在这里没有通过异步/等待获得任何东西。

1

我希望我可以在一次莫名其妙广播到世界的每一个.NET开发人员:异步是多线程/并行处理/后台处理等

异步做一个只有一两件事:它允许当前线程闲置时返回池。而已。期。故事结局。如果您正在做一些创建新线程的操作,那么可以有效地禁止原始线程返回到池中,但您仍然有一个线程。换句话说,你完全没有做任何事情,只是在你的代码中添加了一堆开销和上下文切换,使得它更少效率,而不是更多。

你在这里需要的是一个真正的后台进程。你可以使用类似Hangfire的东西来启动任务,然后可以处理。这可能是一个控制台应用程序,另一个Web应用程序,Azure功能,无论如何。重点在于它是您的主要Web应用程序的外部。然后,你可以立即返回,不用等待那件事,不管它是什么,完成。您也可以利用SignalR和Web工作人员等方式将状态更新推送给客户端。