c# - .NET 单任务等待的用例

标签 c# .net asynchronous

我想知道创建“热”任务并通过阻塞线程等待它有什么用。示例:

Task.Run(() => DoWork()).Wait();

因为主线程将被阻塞,直到任务未完成,所以我只会在主线程中运行 DoWork() ,而不会发生将其放入新任务的事件。

我在互联网上的很多地方(还有 msdn)看到了这个例子,并且在我们公司的项目中发现了这样的代码。仅当我想将取消 token 传递给正在运行的任务时,我才发现它很有用。

最佳答案

想象一下您有一些由其他人编写的第 3 方 API。让我们考虑以下问题:

  1. 您知道存在一些错误,有时功能会挂起。
  2. 您无法自行重写 API。
  3. 没有足够的时间自行重写 API。
  4. API 工作足够好

如果上述任一陈述为真,那么您可能会创建一个任务并等待它完成。

让我们以第一项为例,其中存在导致 API 函数挂起的错误...如果您启动任务并等待 API 函数完成(如下所示),您就不会面临以下风险:基于有问题的 API 挂起整个程序。

ThirdPartyApi api = new ThirdPartyApi();
Task apiFunctionRunning = null;

// start the API's function running on it's own thread
apiFunctionRunning = Task.Run(() =>
{
    api.DoWork();
});

// wait for the API function to complete but also time-out if
// there is some problem where it hangs up (give it maybe 5s)
apiFunctionRunning.Wait(5000);

关于c# - .NET 单任务等待的用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42433041/

相关文章:

java - 将凭据从 dotNet 客户端传递到 Java Web 服务

javascript - 只能发出一个 GET 请求,没有错误 : "Can' t set headers after they are sent. "

javascript - 嵌套的 Promise 被卡住

asynchronous - 如何均衡处理多个并发任务?

c# - 如何取消待机和休眠?

c# - 在页面编辑器中找不到 Sitecore 占位符键

c# - 下载期间即时计算哈希值

c# - 在 tableadapter 上执行自定义查询

c# - 在资源管理器中的文件图标上添加状态图标,例如 .NET 中的 Dropbox 或 SVN

.net - 使用 ClickOnce 应用程序重新命名标题/开始菜单文件夹