如何使用Func <Task <T >>语法?

use*_*753 0 c#

我在另一个答案中找到了这个类.在.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)

Jon*_*eet 7

要添加建议Task.FromResult用于创建任务的其他答案,您还可以使用异步lambda表达式 - 如果要await在lambda表达式的主体内使用,这将非常有用:

m_TaskQueue.Enqueue<int>(
    async () => { 
        await Task.Delay(1000); // For example
        return 1;
    }
);
Run Code Online (Sandbox Code Playgroud)