如何解决匿名函数转换为void返回委托无法返回值的问题

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

我正在尝试为一组任务实现信号量 slim,这些任务旨在向外部 API 请求一些数据。数据可能有不同的格式,因此计划返回 HttpResponseMessage,以便转换器(json 转换器)将处理它。 但是,我在退货时收到上述错误,但我不知道该怎么办:

tasks.Add(
Task<HttpResponseMessage>.Run(() =>
{
    semaphoreSlim.WaitAsync();
    
    try{
        return (SetupRequestAsync(request, HttpMethod.Get));
    }
    catch (Exception ex) { throw ex; }
    finally { semaphoreSlim.Release();  }
    
}, cancelTok
));

cancelTok 是一个取消令牌,一旦我们通过 SetupRequestAsync 从服务器获得有效结果(意味着返回 HttpResponseMessage),就会停止创建线程。

编辑:return有红色下划线,标记有错误,当我将鼠标悬停在上面时,会显示错误。

c# multithreading delegates semaphore cancellation-token
1个回答
0
投票

您需要先创建 lambda

async
,然后
await
在其中进行调用。不要吞下并重新抛出异常,它所做的只是擦除堆栈跟踪。

而且看起来信号量处理应该在 lambda 之外。

try
{
    await semaphoreSlim.WaitAsync(cancelTok);
    var task = Task.Run(async () =>
    {
        return await SetupRequestAsync(request, HttpMethod.Get);
    }, cancelTok);
    tasks.Add(task);
}
finally
{
    semaphoreSlim.Release();
}
© www.soinside.com 2019 - 2024. All rights reserved.