我在另一个答案中找到了这个类.在.NET中管理单独(单个)线程上的任务队列的最佳方法.
我想尝试一下,但语法对我来说有点奇怪.试图启动一个返回单个int的虚拟任务.我无法编译,不知道语法问题是什么.
m_TaskQueue.Enqueue<int>(
() => { return 1; }
);
Run Code Online (Sandbox Code Playgroud)
编译错误:
无法将lambda表达式转换为委托类型,
System.Func<System.Threading.Tasks.Task<int>>因为块中的某些返回类型不能隐式转换为委托返回类型
来自其他答案的课程:
public class TaskQueue
{
private SemaphoreSlim semaphore;
public TaskQueue()
{
semaphore = new SemaphoreSlim(1);
}
public async Task<T> Enqueue<T>(Func<Task<T>> taskGenerator)
{
await semaphore.WaitAsync();
try
{
return await taskGenerator();
}
finally
{
semaphore.Release();
}
}
public async Task Enqueue(Func<Task> taskGenerator)
{
await semaphore.WaitAsync();
try
{
await taskGenerator();
}
finally
{
semaphore.Release();
}
}
}
Run Code Online (Sandbox Code Playgroud)
要添加建议Task.FromResult用于创建任务的其他答案,您还可以使用异步lambda表达式 - 如果要await在lambda表达式的主体内使用,这将非常有用:
m_TaskQueue.Enqueue<int>(
async () => {
await Task.Delay(1000); // For example
return 1;
}
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1706 次 |
| 最近记录: |