问题标签 [synchronizationcontext]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
136 浏览

c# - 任务在显示对话框后启动时冻结 UI

假设我们想要显示一个对话框,当在该对话框中获得异常时task1,我们调用一个方法,该方法会启动一个新的task2. 问题是所有者窗口在task2.

请看一下简单的代码(任务并行库使用):

对我来说,奇怪的是,当我第一次在button1_Click方法中启动任务时它不在 UI 中执行,但是当我第二次启动一个新任务时它在 UI 线程中执行,所以这就是所有者窗口冻结的原因。

谁能澄清为什么这部分代码实际上不是在后台启动任务?

0 投票
1 回答
880 浏览

c# - 如何在 c# 的异步方法中忘记同步上下文

假设我要编写一个异步方法 M。我不知道会使用什么样的同步上下文(UI、ASP.NET、控制台应用程序等)来调用它。我想让该方法尽可能易于使用。这意味着任何人都应该能够通过访问返回任务的 Result 成员来同步调用它。

问题是方法 M 的调用者的同步上下文被泄露给了 M 的被调用者。如果他们中的任何一个想要在传入的同步上下文上继续,那么它可能会死锁(例如,当使用 UI 同步上下文时)。

在调用 M 时忘记同步上下文的一种解决方案是将 M 的内容包装在 Task.Run 中。但是,这将强制线程跳转,包括在 M 中的所有任务都已完成并且所有内容都可以在同一个线程上同步运行而无需上下文切换的情况下。有没有更好的解决方案来忘记线程的同步上下文?或者我是否遗漏了一些东西,这会使这个问题变得无关紧要?

0 投票
1 回答
4609 浏览

c# - BackgroundWorker 进程需要引发要在主 (UI) 线程上处理的自定义事件

我有一个用于大型 CSV 文件的解析器类。parse 方法逐行读取大文件的工作是在 backgroundWorker 中完成的。使用该backgroundWorker.ReportProgress方法将完成百分比信息传递给 UI 线程,以便我的表单上的进度条可以完成它的工作。这工作正常。

但是,我还想引发一个自定义事件,该事件将从 CSV 文件的第一行获取的字段名列表发送回 UI (WPF),以便可以将它们放置在下拉列表中。如果解析器遇到格式错误的行或其他障碍,我还想通过事件通知用户。

我在后台执行的解析器进程可以简单地引发一个事件吗?或者必须将 SynchronizationContext.Current 从主 UI 线程传递到我的解析器类,然后它会使用 Post 方法?

0 投票
2 回答
29395 浏览

c# - 如何获取使用 SynchronizationContext 的任务?以及 SynchronizationContext 是如何使用的?

我仍在学习整个任务概念和 TPL。根据我目前的理解, SynchronizationContext 函数(如果存在)用于await在“某处”分派任务。另一方面,Task类中的函数不使用上下文,对吧?

因此,例如Task.Run(...)将始终在线程池的工作线程上分派操作并SynchronizationContext.Current完全忽略。await Foobar()之后会使用上下文执行生成的任务await吗?

如果这是真的,我的问题是:我怎样才能获得一个Task, 实际运行一个动作但使用 调度SynchronizationContext.Current.Send/Post

任何人都可以推荐一个好的介绍SynchronizationContext,尤其是框架的其余部分何时以及如何使用它们?MSDN似乎对课程非常安静。Google 的热门热门歌曲(此处此处)似乎只针对 Windows 窗体调度。Stephen Cleary 写了一篇文章,很好地了解了哪些上下文已经存在以及它们是如何工作的,但我对它们实际使用的地点和时间缺乏了解。

0 投票
0 回答
511 浏览

.net - .Net Compact Framework:SynchronizationContext 的替代方案

我正在开发一个适用于 Windows CE 6 的程序,该程序由 Visual Studio 2008 解决方案中的两个项目组成,用 VB.Net 编写。之前,我为 Windows 桌面写了一个类似的程序,所以我想尝试尽可能多地重用代码。

通用结构是:第一个项目包含前端 gui,第二个是用于串行通信的库。这个库应该可以被其他 GUI 重用,并且不能依赖于图形的东西,例如Control .

在第二个库项目中,我使用了一个SerialPort实例,数据的接收是通过SerialPort.DataReceived事件处理的。正如DataReceived在第二个线程中发生的那样,我SynchronizationContext桌面变体中使用,Invoke不能不依赖图形内容。下面是一个简单的例子:

将此代码移植到 .Net CF 时,没有SynchronizationContext可用的。我在网上搜索,找到了这些: http ://www.planetgeek.ch/2009/02/03/part-i-mimic-synchronizationcontext-behaviour-on-net-cf/ http://www.planetgeek.ch /2009/02/15/part-ii-mimic-synchronizationcontext-behaviour-on-net-cf/ 但是作者正在使用我不想使用的 Control.Invoke(它在 System.Windows.Forms 中)

由于几天来我没有发现其他方法,我的问题是:如何解决这个问题?

谢谢,

克里斯托夫

0 投票
1 回答
2116 浏览

c# - 如何在 MonoTouch 中使用 async/await 忽略未观察到的异常?

在以前的 MonoTouch 版本中,我曾经这样做以忽略未观察到的异常:

这是否是一个好的做法是有争议的,但我想知道使用Xamarin.iOS 6.4 现在正式支持的async/await关键字来达到相同的效果。

这是我用于测试的代码:

当我运行它时,调试器暂停AsyncVoidMethodBuilder

在此处输入图像描述

我读到 .NET 4.5 应该改变了行为,因此未观察到的异常不会使应用程序崩溃——但是如果将异常发布到我无法处理的 UIKit 同步上下文中,这将无济于事。

有没有办法忽略awaitMonoTouch 中未观察到的异常?

0 投票
1 回答
241 浏览

c# - SynchronizationContext 是否仅用于 WPF、Win 表单?

我读到的每篇关于 SynchronizationContext 的文章都谈到了处理表单的控件。它是 SynchronizationContext 的唯一目的吗?

我还必须问一个基本的问题:如果 UI 线程使用它,为什么我不能在使用每个控件之前锁定它?为什么我需要所有这些“SynchronizationContext”来与控件进行通信?我的意思是,这不是传达控件的更好方式吗?(我知道它不会工作)。

文章:

http://blogs.msdn.com/b/csharpfaq/archive/2010/06/18/parallel-programming-task-schedulers-and-synchronization-context.aspx

http://reedcopsey.com/2010/03/18/parallelism-in-net-part-15-making-tasks-run-the-taskscheduler/

..

0 投票
0 回答
205 浏览

c# - 如何将移动应用程序的数据库与主服务器的数据库同步

我正在构建一个应用程序,可以帮助员工根据客户的余额向客户收款。该应用程序应该可以从互联网离线运行。当它上线时,它应该将其收集记录发送到主服务器的数据库。

主数据库中有 5000 名客户,客户的余额一直在变化。我应该如何在移动应用程序的数据库和主服务器的数据库之间同步?我应该截断移动应用程序的数据库并从主服务器获取所有记录并将它们插入手机吗?或者我应该为每个客户端执行更新操作?顺便说一句,新客户端也可以随时创建?

哪种方式更有效?

0 投票
3 回答
10691 浏览

c# - 我不想等待的异步任务怎么办?

我正在编写一个多人游戏服务器,并且正在寻找新的 C# async/await 功能可以帮助我的方式。服务器的核心是一个循环,它会尽可能快地更新游戏中的所有参与者:

这个循环需要处理数千个actor并每秒更新多次以保持游戏流畅运行。有些演员偶尔会在他们的更新功能中执行缓慢的任务,例如从数据库中获取数据,这是我想使用异步的地方。一旦检索到这些数据,actor 想要更新游戏状态,这必须在主线程上完成。

由于这是一个控制台应用程序,我计划编写一个 SynchronizationContext,它可以将挂起的委托分派到主循环。这允许这些任务在完成后更新游戏,并将未处理的异常抛出到主循环中。我的问题是,如何编写异步更新函数?这非常有效,但违反了不使用 async void 的建议:

我可以使 Update() 异步并将任务传播回主循环,但是:

  • 我不想为永远不会使用它的数千个更新增加开销。
  • 即使在主循环中,我也不想等待任务并阻塞循环。
  • 等待任务无论如何都会导致死锁,因为它需要在等待线程上完成。

我该如何处理所有这些我无法等待的任务?我可能想知道他们都完成的唯一一次是当我关闭服务器时,但我不想收集可能需要数周的更新产生的每一个任务。

0 投票
1 回答
595 浏览

c# - TAP 中的 SynchronizationContext 默认行为(任务异步模式)

据此_

如果 BackgroundWorker 从其 DoWork 处理程序启动另一个 BackgroundWorker,则嵌套的 BackgroundWorker 不会捕获 UI SynchronizationContext

在此处输入图像描述

但是,对于 .NET 4.0,尤其是 4.5 以后的版本,我从这里看到了很多这样的示例代码:

所以看起来你可以使用任务嵌套异步调用,并且 SynchronizationContext 将在嵌套调用下浮动。这个对吗?

如果是这样,有人可以向我解释 TAP 如何在非常高的水平上做到这一点。

如果不是,我需要做什么来确保我的嵌套调用可以发布到 UI 线程?

或者可能是我对原文章的理解完全错误?默认情况下,新任务的创建是否会选择当前的同步上下文?如果是这样,除非你明确地给它一个新的同步上下文,否则它怎么能在原始同步上下文之外的任何东西上运行?

请帮助我消除混乱。