c# – 将异步 *** 作转换为异步函数委托,保留同步异常传递

c# – 将异步 *** 作转换为异步函数委托,保留同步异常传递,第1张

概述我想将异步 *** 作委托转换为返回指定值的异步函数委托.我想出了一个扩展方法: public static Func<Task<TResult>> Return<TResult>(this Func<Task> asyncAction, TResult result){ ArgumentValidate.NotNull(asyncAction, nameof(asyncAction)); 我想将异步 *** 作委托转换为返回指定值的异步函数委托.我想出了一个扩展方法:

public static Func<Task<TResult>> Return<TResult>(this Func<Task> asyncAction,TResult result){    ArgumentValIDate.NotNull(asyncAction,nameof(asyncAction));    return async () =>    {        await asyncAction();        return result;    };}

但是,我的扩展方法是错误的,因为从 *** 作委托同步传递的异常现在从函数委托异步传递.具体来说:

Func<Task> asyncAction = () => { throw new InvalIDOperationException(); };var asyncFunc = asyncAction.Return(42);var task = asyncFunc();   // exception should be thrown hereawait task;               // but instead gets thrown here

有没有办法以同步异常继续同步传递的方式创建此包装器?继续继续前进的道路吗?

更新:同步抛出异常的异步 *** 作的具体示例:

public static Task WriteallBytesAsync(string filePath,byte[] bytes){    if (filePath == null)        throw new ArgumentNullException(filePath,nameof(filePath));    if (bytes == null)        throw new ArgumentNullException(filePath,nameof(bytes));    return WriteallBytesAsyncInner(filePath,bytes);}private static async Task WriteallBytesAsyncInner(string filePath,byte[] bytes){    using (var fileStream = file.OpenWrite(filePath))        await fileStream.WriteAsync(bytes,bytes.Length);}

测试:

Func<Task> asyncAction = () => WriteallBytesAsync(null,null);var asyncFunc = asyncAction.Return(42);var task = asyncFunc();   // ArgumentNullException should be thrown hereawait task;               // but instead gets thrown here
解决方法 好吧,你将无法在初始调用中使用异步.这很清楚.但是您可以使用调用该函数的同步委托,然后捕获返回的任务以在异步委托中等待它:

public static Func<Task<TResult>> Return<TResult>(this Func<Task> asyncAction,nameof(asyncAction));    return () =>    {        // Call this synchronously        var task = asyncAction();        // Now create an async delegate for the rest        Func<Task<TResult>> intermediate = async () =>         {            await task;            return result;        };        return intermediate();    };}

或者,将它重构为两个方法,基本上将异步lambda表达式提取为异步方法:

public static Func<Task<TResult>> Return<TResult>(    this Func<Task> asyncAction,nameof(asyncAction));    return () =>    {        var task = asyncAction();        return AwaitAndReturn(task,result);    };}public static async Func<Task<TResult>> AwaitAndReturn<TResult>(    this Task asyncAction,TResult result){    await task;    return result;}
总结

以上是内存溢出为你收集整理的c# – 将异步 *** 作转换为异步函数委托,保留同步异常传递全部内容,希望文章能够帮你解决c# – 将异步 *** 作转换为异步函数委托,保留同步异常传递所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1219906.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存