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# – 将异步 *** 作转换为异步函数委托,保留同步异常传递所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)