相关疑难解决方法(0)

如何安全地混合同步和异步代码?

我有这个纯粹同步的库.它暴露了同步方法,我有客户端使用它.

对于想要使用它的人,我将底层实现更改为异步和公开的异步方法.但现在我有很多复制代码.异步代码似乎表现更好.我希望现有客户能够利用它,我想消除代码重复.

有没有安全的方法来保持同步签名和调用异步实现?

在打电话时我特别害怕死锁.Result和.Wait.

.net c# deadlock asynchronous async-await

18
推荐指数
1
解决办法
9353
查看次数

c#5等待API设计中的/ async模式

c#5等待/异步模式如何提升处理协同程序的新API(如Jon Skeet在最近的帖子中所示)或者演员模型的表现力?

c#

6
推荐指数
1
解决办法
2221
查看次数

如何实现异步方法及其同步方法?

我有一个方法,例如Task<string> GetContentAsync(string url),我的控制台应用程序还没有完全准备好在内部利用TPL,但可能在以后它会.

如何为这个(或其他)方法轻松编写同步包装器(不是替代实现)?

.net c# task-parallel-library

6
推荐指数
1
解决办法
2417
查看次数

保持同步和异步实现

维护方法的同步和异步版本的最佳实践是什么?

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)

.net c# async-await

4
推荐指数
1
解决办法
652
查看次数

以异步方式调用同步方法?

我正在开发一个 ASP.NET MVC WebApi 项目,其中一种方法需要进行 LDAP 搜索。搜索从 LDAP 服务器检索的信息量确保调用至少需要 7 秒才能完成。调用,因为它使用System.DirectoryServices.Protocols类和方法,是同步和不可修改的。

此 API 将接收的流量相当大(即使 API 位于内部网络中),因此每次调用 LDAP 服务器 7 秒并不是一个好主意。所以我想知道这个:

  • 将它包装在异步方法中是个好主意吗?
  • 异步此调用的正确方法是什么?(是await Task.Run(() => Search(params))一种可以接受的方式吗?)

c# ldap-query async-await asp.net-web-api

1
推荐指数
1
解决办法
506
查看次数

异步和同步版本的方法

好了,所以我一直在阅读了大量和最好的方式工作使用async methodstask,等我相信我(主要)了解它,但我要检查,以确保.

我确实开始async wrappers使用同步任务,Task.Run()但最近读到,只有拥有一个sync method并让应用程序确定是否需要通过使用Task.Run()自身将其推送到另一个线程更好,这是有道理的.但是,我也读过这个例外是自然而然的async functions.我不知道我完全理解"自然异步",但作为一个基本的了解似乎.NET框架的方法,提供async methodsnaturally asyncWebClient.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()) …

.net c# webclient task-parallel-library async-await

1
推荐指数
1
解决办法
511
查看次数