首页 > 解决方案 > C#队列一个任务,当它将从队列中执行时返回结果

问题描述

我有以下结构:

 //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 签署了这个答案的可能副本,但我不确定它是否可以处理结果......如果这是正确的方法,有人可以制作更好的样本吗?我不清楚

标签: c#multithreadingqueuesingletontask

解决方案


您可以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 顺序。然而,这是一种强制对共享资源进行独占访问的方法,这应该足以满足您的需要。


推荐阅读