我具有以下结构:
//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的可能重复项,但我不确定它是否可以处理结果...如果这是正确的方法,请有人提供更好的样本?对我来说还不清楚
答案 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顺序。但是,这是一种强制对共享资源进行独占访问的方法,这足以满足您的需求。