如何使用Func <task <t>&gt;句法?

时间:2015-06-02 14:32:19

标签: c#

我在另一个答案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();
        }
    }
}

2 个答案:

答案 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)创建一个。