将同步代码包装到异步方法中的最佳方法是什么
我正在使用async-await方法创建一个应用程序。 但是使用它们对我来说存在很大问题。 在阅读了一些文章之后,我仍然不知道将重同步操作包装到异步方法的最佳方法是什么。
我有2个想法。 哪一个是最好的?
1)目前的实现。
private Task<List> ParseTestFiles(List filesContent) { var tcs = new TaskCompletionSource<List>(); Task.Run(() => { var resultList = new List(); foreach (var testBody in filesContent) { try { var currentCulture = Thread.CurrentThread.CurrentCulture; var serializerSettings = new JsonSerializerSettings { Culture = currentCulture }; var parsedData = JsonConvert.DeserializeObject(testBody, serializerSettings); resultList.Add(parsedData); } catch(Exception exception) { tcs.SetException(exception); } } tcs.SetResult(resultList); }); return tcs.Task; }
我正在使用Task.Run和TaskCompletionSource
2)仅使用没有TaskCompletionSource的Task.Run
private Task<List> ParseTestFiles(List filesContent) { return Task.Run(() => { . . . . return resultList; }); }
我也不会用。 对于调用方法调用的人,你会撒谎。 当您公开异步操作时,调用者希望它是自然异步的,这意味着它背后没有线程正在工作。
您的所有方法都是inheritance同步的,您应该将它们公开。 将其留给调用者来决定是否要同步调用它们或使用线程并将其排队,不要决定它们。
有一篇很棒的文章名为“ 我应该为同步方法公开异步包装器吗? 斯蒂芬·图布(Stephan Toub)谈到了不做你想要做的事情的所有理由。 我建议阅读它。
- Clickonce完全信任应用程序更新失败,在Windows 8上出现TrustNotGrantedException
- PasswordVault在多大程度上保护和隔离数据?
- File.Delete在之前调用Image.FromFile时失败,尽管复制了加载的图像并破坏了原始图像
- 在C#中从SQL Server流式传输VARBINARY数据
- 发送文件夹重命名命令到Windows资源管理器
- 单声道C#十进制分割的精度是不同的?
- 为什么Convert.ToInt32(null)在c#中返回0
- 如何使用IL改变盒装结构
- C#OneDrive for Business / SharePoint:从本地同步文件获取服务器路径