我有这个纯粹同步的库.它暴露了同步方法,我有客户端使用它.
对于想要使用它的人,我将底层实现更改为异步和公开的异步方法.但现在我有很多复制代码.异步代码似乎表现更好.我希望现有客户能够利用它,我想消除代码重复.
有没有安全的方法来保持同步签名和调用异步实现?
在打电话时我特别害怕死锁.Result和.Wait.
c#5等待/异步模式如何提升处理协同程序的新API(如Jon Skeet在最近的帖子中所示)或者演员模型的表现力?
我有一个方法,例如Task<string> GetContentAsync(string url),我的控制台应用程序还没有完全准备好在内部利用TPL,但可能在以后它会.
如何为这个(或其他)方法轻松编写同步包装器(不是替代实现)?
维护方法的同步和异步版本的最佳实践是什么?
Let's suppose we have the following method:
public ImportData Import(ZipFile zipFile)
{
... //Step 1. Initialization
var extractedZipContent = zipFile.Extract(); //Step 2
... //Step 3. Some intermediate stuff
var parsedData = ParseExtractedZipContent(extractedZipContent); //Step 4
... //Step 5. Some code afterwards
}
Run Code Online (Sandbox Code Playgroud)
第2步和第4步是长时间运行的,所以我们想在异步版本的Import方法中异步调用它们:
public async Task<ImportData> ImportAsync(ZipFile zipFile)
{
... //Step 1. Initialization
var extractedZipContent = await zipFile.Extract(); //Step 2
... //Step 3. Some intermediate stuff
var parsedData = await ParseExtractedZipContentAsync(extractedZipContent); //Step 4
... //Step 5. Some code afterwards
} …Run Code Online (Sandbox Code Playgroud) 我正在开发一个 ASP.NET MVC WebApi 项目,其中一种方法需要进行 LDAP 搜索。搜索从 LDAP 服务器检索的信息量确保调用至少需要 7 秒才能完成。调用,因为它使用System.DirectoryServices.Protocols类和方法,是同步和不可修改的。
此 API 将接收的流量相当大(即使 API 位于内部网络中),因此每次调用 LDAP 服务器 7 秒并不是一个好主意。所以我想知道这个:
await Task.Run(() => Search(params))一种可以接受的方式吗?)好了,所以我一直在阅读了大量和最好的方式工作使用async methods和task,等我相信我(主要)了解它,但我要检查,以确保.
我确实开始async wrappers使用同步任务,Task.Run()但最近读到,只有拥有一个sync method并让应用程序确定是否需要通过使用Task.Run()自身将其推送到另一个线程更好,这是有道理的.但是,我也读过这个例外是自然而然的async functions.我不知道我完全理解"自然异步",但作为一个基本的了解似乎.NET框架的方法,提供async methods的naturally async和WebClient.DownloadFile/DownlodFileAsync是其中之一.
所以我有两种方法,如果有人愿意提供反馈,我想测试我的理解,并确保这是正确的.
方法一是在本地操作系统上移动一些文件,看起来像这样(伪代码):
Public static void MoveStagingToCache()
{
...do some file move, copy, delete operations...
}
Run Code Online (Sandbox Code Playgroud)
第二个看起来像这样(伪代码):
Public static void DownloadToCache()
{
...do some analysis to get download locations...
using (var wc = new WebClient())
{
wc.DownloadFile(new Uri(content.Url), targetPath);
}
...do other stuff...
}
Run Code Online (Sandbox Code Playgroud)
所以我的理解如下.第一种方法应保持原样,因为没有文件操作方法具有async versions,因此不太可能async.调用者只需调用MoveStagingToCache()运行同步或调用Task.Run(()=>MoveStagingToCache()) …