【发布时间】:2015-06-02 14:32:19
【问题描述】:
我在另一个答案Best way in .NET to manage queue of tasks on a separate (single) thread 中找到了这门课。
我想尝试一下,但语法对我来说有点奇怪。试图启动一个返回单个 int 的虚拟任务。我无法编译,不知道是什么语法问题。
m_TaskQueue.Enqueue<int>(
() => { return 1; }
);
编译器错误:
无法将 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();
}
}
}
【问题讨论】:
-
错误编译器在说什么?
-
你正在传递
Func<int>而不是Func<Task<int>> -
旁注:您发现的代码不会在单独的线程上安排任务,因此添加同步任务通常毫无意义,因为它们会在当前线程上同步运行。
标签: c#