Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >异步和等待没有“线程”?我能自定义下会发生什么吗?

异步和等待没有“线程”?我能自定义下会发生什么吗?
EN

Stack Overflow用户
提问于 2013-06-03 06:41:40
回答 3查看 1.2K关注 0票数 10

关于新的async/await关键字和C# 4.5中的Task类的可定制性,我有一个问题。

首先,了解我的问题的一些背景:我正在开发一个具有以下设计的框架:

  • 一个线程有一个“当前要做的事情”的列表(通常是100到200个项),它们作为一个自己的数据结构存储,并作为一个列表保存。它有一个Update()函数,它枚举列表并查看某些“事物”是否需要执行,并这样做。基本上就像一个大的螺纹脱落器。为了简化事情,让我们假设“要做的事情”是在“完成”时返回布尔true的函数(不应该被称为next ),而false则是当sheduler应该再次调用它们的下一个更新时返回它们的函数。
  • 所有的“事物”都不能同时运行,也必须在这个线程中运行(因为线程是静态变量)。
  • 还有其他的线程可以做其他的事情。它们是以相同的方式构造的:在一个大的Update() -函数中迭代几百件事情的大循环。
  • 线程可以相互发送消息,包括“远程过程调用”。对于这些远程调用,RPC系统将某些未来的对象返回到结果值。在另一个线程中,插入一个新的“要做的事情”。
  • 一个常见的“事情”就是把RPC串在一起。目前,这个“链接”的语法非常冗长和复杂,因为您必须手动检查以前的RPC的完成状态并调用下一个RPC等等。

举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Future f1, f2;
bool SomeThingToDo() // returns true when "finished"
{
    if (f1 == null)
        f1 = Remote1.CallF1();
    else if (f1.IsComplete && f2 == null)
        f2 = Remote2.CallF2();
    else if (f2 != null && f2.IsComplete)
        return true;
    return false;
}

现在,这一切听起来都令人敬畏,就像asyncawait of C# 5.0一样,在这里可以帮助我。我还没有百分之百完全理解它在引擎盖下做了什么(有什么好的参考资料吗?),但是当我从我看过的几次演讲中得到它时,它用这个非常简单的代码做了我想做的事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async Task SomeThingToDo() // returning task is completed when this is finished.
{
    await Remote1.CallF1();
    await Remote2.CallF2();
}

但是我想不出如何编写我的Update()函数来实现这样的事情。asyncawait似乎想使用Task类,而Task类又似乎需要真正的线程?

到目前为止,我最接近的“解决方案”:

第一个线程(运行SomeThingToDo)只调用它们的函数一次,并将返回的任务存储在每个Update()上,测试任务是否完成。

Remote1.CallF1返回一个带有空操作作为构造函数参数的新任务,并记住返回的任务。当F1实际完成时,它调用任务上的RunSynchronously()将其标记为已完成。

在我看来,这是对任务系统的歪曲。此外,它在两个线程之间创建共享内存(任务的IsComplete布尔值),如果可能的话,我希望用我们的远程消息处理系统来替换它们。

最后,它不能解决我的问题,因为它不适用于上面类似等待的SomeThingToDo实现。异步函数返回的自动生成的任务对象似乎立即完成了吗?

最后我的问题是:

  1. 我能不能连接到异步/等待使用我自己的实现而不是Task<T>
  2. 如果这是不可能的,我可以使用Task而不使用任何与“阻塞”和“线程”相关的东西吗?
  3. 在编写asyncawait时,有什么好的参考吗?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-03 06:58:50

我还没有百分之百完全理解它在引擎盖下的作用--有什么好的参考资料吗?

回到我们设计Mads功能的时候,Stephen和我为MSDN杂志写了几篇不同级别的文章。链接在这里:

http://blogs.msdn.com/b/ericlippert/archive/2011/10/03/async-articles.aspx

从我的文章开始,然后是麦德斯的,然后是斯蒂芬的。

异步函数返回的自动生成的任务对象似乎立即完成了吗?

不,它们是在方法主体中的代码返回或抛出时完成的,与任何其他代码相同。

我可以连接到异步/等待使用我自己的实现而不是Task<T>吗?

包含await的方法必须返回voidTaskTask<T>。但是,等待的表达式可以返回任何类型,只要您可以在其上调用GetAwaiter()。这不一定是Task

如果这是不可能的,我是否可以在没有任何与“阻塞”和“线程”相关的情况下使用Task?

绝对一点儿没错。Task只是代表将来将要完成的工作。虽然这项工作通常是在另一个线程上完成的,但没有要求。

票数 13
EN

Stack Overflow用户

发布于 2013-06-03 06:52:56

我能连接到异步/等待使用我自己的实现而不是任务吗?

是。

如果这是不可能的,我是否可以在没有任何与“阻塞”和“线程”相关的情况下使用Task?

是。

有什么好的参考吗?当我写异步并等待时会发生什么?

是。

我会劝你不要问“是”或“否”的问题。你可能不只是想要“是”或“不是”。

异步和等待似乎想要使用任务类,而任务类又似乎需要真正的线程?

不,那不是真的。Task表示将来某个时候可以完成的事情,可能会有一个结果。它有时是另一个线程中某些计算的结果,但不需要这样做。它可以是未来某一时刻发生的任何事情。例如,它可能是IO操作的结果。

Remote1.CallF1返回一个带有空操作作为构造函数参数的新任务,并记住返回的任务。当F1实际完成时,它调用任务上的RunSynchronously()将其标记为已完成。

所以,这里您缺少的是TaskCompletionSource类。有了那块缺失的拼图,应该有很多地方适合。您可以创建TCS对象,将Task从它的Task属性传递到to...whomever周围,然后使用SetResult属性来表示它已经完成。这样做不会导致创建任何额外的线程,也不会使用线程池。

请注意,如果您没有结果,只想要一个Task而不是Task<T>,那么只需使用TaskCompletionSource<bool>或类似的东西,然后使用SetResult(false)或其他合适的东西。通过将Task<bool>转换为Task,您可以将该实现隐藏在公共API中。

这也应该提供你问的前两个问题的“如何”变化,而不是你问的“我可以”的版本。您可以使用一个TaskCompletionSource来生成一个任务,只要您说它是完成的,就可以使用您想要的任何异步构造,这可能涉及到也可能不涉及使用其他线程。

票数 5
EN

Stack Overflow用户

发布于 2013-06-03 06:53:10

回答你的问题:

我能连接到异步/等待使用我自己的实现而不是任务吗?

是。你可以等待任何东西。不过,我不建议这样做。

如果这是不可能的,我是否可以在没有任何与“阻塞”和“线程”相关的情况下使用Task?

Task类型代表未来。它不一定在线程上“运行”;它可以表示下载的完成,或者计时器过期等等。

有什么好的参考吗?当我写异步并等待时会发生什么?

如果您的意思是就代码转换而言,这篇博客文章有一个很好的并排。这并不是百分之百准确的细节,但它足以写一个简单的定制侍者。

如果你真的想扭曲async做你的出价,乔恩斯基特的教育异步系列是最好的资源。不过,我真的不建议您在生产中这样做。

您可能会发现我的简介在介绍async概念和推荐的使用方法时很有帮助。官方MSDN文档也非常好。

我确实编写了适用于您的情况的;它们为async/await方法定义了一个单线程上下文。您可以使用AsyncContextThreadFactory属性将工作(或发送消息)排队到它。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16899402

复制
相关文章
如何修复WordPress内容更新和发布失败错误
如果您的WordPress网站在您尝试进行更改时返回诸如“更新失败”或“发布失败”之类的错误消息,那么结果不仅令人沮丧,而且还会阻止访问者访问他们需要的内容。
青梅煮码
2023/01/14
5.5K0
如何修复WordPress内容更新和发布失败错误
WordPress 版本更新
WordPress 是一个内容管理系统 (WCM),即它是一种以最佳方式组织创建、存储和展示 Web 内容的整个过程的工具。WordPress 作为一种改进工具开始了它的旅程,以增强日常写作的常规排版。但它被视为一种博客工具,当我们进入今年最后一个季度时,WordPress 成为最常用的 WCM 系统,而且不仅在博客社区中也是如此。
海拥
2023/01/01
2.7K0
WordPress 版本更新
如何修复WordPress更新失败/发布失败错误,您可能已掉线
WordPress CMS是一个完全开源的工具,对用户免费,但是,由于插件等原因,有时会出现一些奇怪的错误消息,这些WordPress错误可能会影响网站的效果,也可能会给网站带来意想不到的后果。
晓得博客
2021/04/07
8K0
错误——持续更新
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/48551789
用户1451823
2018/09/13
1.8K0
错误——持续更新
WordPress更新文章 显示最近更新时间
子比主题为了防止更新后失效 请在目录内新建func.php 文件 插入上方代码即可
残浔
2023/05/11
6740
wordpress 5.8更新,支持webp
  wordpress 5.8刚刚发布更新,支持webp格式的图片上传,如下图所示。WebP 是一种现代图像格式,可为网络上的图像提供改进的无损和有损压缩。WebP 图像比它们的 JPEG 或 PNG 等效图像平均小 30% 左右,从而使网站速度更快,使用的带宽更少。
ytkah
2021/07/23
2.2K0
WordPress 发布 4.0.1 安全更新,强烈建议更新
WordPress 4.0.1 发布,这是一个非常关键的安全修复版本,强烈建议每位用户都升级到最新版本!
Denis
2023/04/15
4330
ubuntu更新源出现错误
有的小伙伴出现了残留源错误,有的人说重装,有的人说改sourcelist,这些方法诚然好使,但都是高射炮打蚊子:小题大作。 现在来说解决方法: 先选右下九个点
全栈程序员站长
2022/08/27
1.3K0
ubuntu更新源出现错误
如何禁用WordPress升级更新通知
WordPress 提供的更新通知对于了解新的可用更新和跟踪站点上的自动更新很有用。但是也有像子凡我这样希望禁用它们以减少 WordPress 仪表板或电子邮件收件箱中的混乱情况。或者,这可能是因为你使用不同的方式来管理更新,从而使通知变得多余。当然子凡我只是因为当 WordPress 核心有升级时,普通的作者编辑人员后台也有提示,这就造成了不需要的通知,所以最直接的方式就是除了管理员其它用户没必要看到 WordPress 的升级更新通知。
张子凡
2023/01/09
1.8K0
如何禁用WordPress升级更新通知
WordPress 技巧:禁止插件更新提醒
这个技巧会阻止 WordPress 检查插件是否有有更新,这个技巧对于给客户建的网站非常有帮助,因为很可能你已经修改了插件,插件的更新将会让整个网站不能正常运行。
Denis
2023/04/15
4750
实用WordPress插件收集(更新中)
wordpress里面的页面的显示顺序是无法控制的。你无法控制某个页面排在前面或者排在后面。 而有时候,我们又确实需要控制某些页面的显示顺序,那么就可以用My Page Order这个wordpress插件了。
星哥玩云
2022/06/11
4720
WordPress 网站怎么关闭自动更新和更新提示
WordPress 网站怎么关闭自动更新和更新提示?之前不是因为 WordPressP 自动更新导致主题无法正常使用,首页出现“空白模板:索引”。原文:《WordPress 自动更新后出现“空白模板:索引”的解决方法》但是我操作之后发现首页依然是“空白模板”,第一反应会不会是系统又自动更新了。故有此教程。
主机教程网2bcd.com
2022/10/17
1.2K0
禁用WordPress致命错误(WSOD)处理
WordPress 5.2内置了一个新功能,当检测到插件或主题发生错误时,自动发送邮件通知网站管理员,即使在后端完全无法访问的情况下(例如发生所谓的“白屏死机”),管理员仍然有机会登录并对此问题采取措施。
可定
2020/04/20
6020
[已解决]如何修复另一个更新正在进行中WordPress升级错误
在使用WordPress建站时,是否遇到过 WordPress 网站当前正在进行另一个更新的错误?此错误会阻止您更新 WordPress 版本,没有正在进行的核心、主题或插件的更新,重新启动更新过程也会导致出现相同的通知,显然是有某种 WordPress 更新锁阻止更新初始化。在本文中,我们晓得博客将向您展示如何修复另一个更新正在进行中WordPress升级错误。
晓得博客
2021/08/12
3.7K0
WordPress 手动升级更新方法
魏艾斯博客有个 wordpress 站很久没有更新版本了,每次 WordPress 升级都会对已发行问题进行安全修复,所以还是尽量的升级到最新版本。前几天上去看了一下最新版本 4.73,点击现在更新后,页面提示:请重试。然后就在这里反复循环了。试过了很多办法比如删除数据库中的版本更新锁定命令行也无效,干脆就手动更新吧。 WordPress 的主题和插件众多,如果你用的主题是比较简单的那还好说,我们不考虑这方面的情况而盲目设置自动升级,很容易导致升级之后出现错误,严重的会导致网站页面变空白、不兼容等问题。所以
魏艾斯博客www.vpsss.net
2018/06/01
4.7K0
点击加载更多

相似问题

自定义javascript确认框

11

angularjs自定义确认框

72

自定义警报/确认框

21

使用TypeScript自定义确认框

10

自定义确认对话框

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文