将 Func 委托与异步方法结合使用

问题描述 投票:0回答:5

我正在尝试将 Func 与异步方法一起使用。我收到一个错误。

无法将异步 lambda 表达式转换为委托类型

'Func<HttpResponseMesage>'
。异步 lambda 表达式可能返回 void、Task 或
Task<T>
,其中任何一个都不能转换为
'Func<HttpResponseMesage>'

下面是我的代码:

public async Task<HttpResponseMessage> CallAsyncMethod()
{
    Console.WriteLine("Calling Youtube");
    HttpClient client = new HttpClient();
    var response = await client.GetAsync("https://www.youtube.com/watch?v=_OBlgSz8sSM");
    Console.WriteLine("Got Response from youtube");
    return response;
}

static void Main(string[] args)
{
    Program p = new Program();
    Task<HttpResponseMessage> myTask = p.CallAsyncMethod();
    Func<HttpResponseMessage> myFun =async () => await myTask;
    Console.ReadLine();
}
c# asynchronous lambda
5个回答
155
投票

正如错误所述,异步方法返回

Task
Task<T>
void
。因此,要使其发挥作用,您可以:

Func<Task<HttpResponseMessage>> myFun = async () => await myTask;

5
投票

我通常采取的路径是让

Main
方法调用返回任务的
Run()
方法,然后在
.Wait()
上调用
Task
来完成。

class Program
{
    public static async Task<HttpResponseMessage> CallAsyncMethod()
    {
        Console.WriteLine("Calling Youtube");
        HttpClient client = new HttpClient();
        var response = await client.GetAsync("https://www.youtube.com/watch?v=_OBlgSz8sSM");
        Console.WriteLine("Got Response from youtube");
        return response;
    }

    private static async Task Run()
    {
        HttpResponseMessage response = await CallAsyncMethod();
        Console.ReadLine();
    }

    static void Main(string[] args)
    {
        Run().Wait();
    }
}

这允许控制台应用程序的其余部分在完全异步/等待支持的情况下运行。由于控制台应用程序中没有任何 UI 线程,因此使用

.Wait()
时不会面临死锁的风险。


3
投票

代码修复,例如:

static void Main(string[] args)
        {
            Program p = new Program();
            Task<HttpResponseMessage> myTask = p.CallAsyncMethod();
            Func<Task<HttpResponseMessage>> myFun = async () => await myTask;
            Console.ReadLine();
        }

0
投票
            Transaction transactionInDb = await new Func<Task<Transaction>>(async () =>
            {
                  return await _repo.Transactions.FirstOrDefaultAsync();
            }).Invoke();

-2
投票

在Func内部运行任务,等待它并检查异常,然后返回结果。

Func<HttpResponseMessage> myFun = () => 
{
   var t = Task.Run(async () => await myTask);
   t.Wait();
   if (t.IsFaulted)
      throw t.Exception;
   return t.Result;
};
© www.soinside.com 2019 - 2024. All rights reserved.