c# - 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 签署了这个答案的可能副本,但我不确定它是否可以处理结果......如果这是正确的方法,有人可以制作更好的样本吗?我不清楚
解决方案
您可以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 顺序。然而,这是一种强制对共享资源进行独占访问的方法,这应该足以满足您的需要。
推荐阅读
- wpf - 使用 Prism 7 的 WPF 应用程序:如何使用具有多个具体类的接口为 VM 注册和导航
- java - 协助确定算法的执行时间
- r - 我正在尝试制作一个简单的数据框,而我正在使用的代码并没有给我我所期望的
- r - 将列名传递给函数
- c++ - NtCreateThreadEx 在 Windows 10 64 位 1909 上不起作用
- python - 在 Azure Batch 中使用托管标识在批处理池中使用 Python 对 Key Vault 进行身份验证
- javascript - Javascript 问题:如何选择所有具有相同类名的 div 并附加一个事件?
- postgresql - PostgreSQL:我该如何解决这个问题?
- bash - 这个 bash 参数扩展语法是什么?
- javascript - 将表单值传递到下一个 html 页面