C#将任务从队列中执行时返回一个返回结果的任务

时间:2019-05-17 13:25:44

标签: c# multithreading queue singleton task

我具有以下结构:

 //function called from Node.js
 public Task<object> NodeCall (IDictionary<string, object> payload) {
     Func<object, Task<object>> changed = (Func<object, Task<object>>) payload["changed"];

     return Task.Run (async () => await OnQuery (payload["request"], changed));
 }

public async Task<object> OnQuery (dynamic request, dynamic payload = null) {
    var result = new QueryCallback ();
    //...code...
    return result
}

在“ OnQuery”的代码中,我应该调用单例类的函数,并且需要将调用排队。问题是排队我无法处理线程响应并等待结果发送任务。

我的最终结果是:将任务放入队列中,当单例使我的任务出队并完成目标函数时,我返回结果。 在一段时间内,OnQuery任务应该等待而不返回任何内容。

有人可以帮我吗?

谢谢

编辑1 Servy签名为this answer的可能重复项,但我不确定它是否可以处理结果...如果这是正确的方法,请有人提供更好的样本?对我来说还不清楚

1 个答案:

答案 0 :(得分:-1)

您可以按照duplicate所述使用SemaphoreSlim

private readonly SemaphoreSlim _mutex = new SemaphoreSlim(1);
public async Task<object> OnQuery (dynamic request, dynamic payload = null)
{
  await _mutex.WaitAsync();
  try
  {
    var result = new QueryCallback ();
    //...code...
    return result
  }
  finally
  {
    _mutex.Release();
  }
}

侧面说明:从技术上讲,这不是 queue ,因为不能保证严格的FIFO顺序。但是,这是一种强制对共享资源进行独占访问的方法,这足以满足您的需求。