我在另一个答案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();
}
}
}
答案 0 :(得分:7)
要添加建议使用Task.FromResult
创建任务的其他答案,您还可以使用异步lambda表达式 - 如果您想在await
体内使用m_TaskQueue.Enqueue<int>(
async () => {
await Task.Delay(1000); // For example
return 1;
}
);
,这将非常有用。 lambda表达式:
var str = "43215";
console.log("Before : \n string :"+str+"\n Length :"+str.length);
var max = 9;
while(str.length < max ){
str = "0" + str;
}
console.log("After : \n string :"+str+"\n Length :"+str.length);
答案 1 :(得分:1)
由于错误试图告诉您,您需要一个返回Task<T>
。
您可以使用Task.FromResult(1)
创建一个。