【发布时间】:2015-02-25 16:45:28
【问题描述】:
将UI Thread的TaskScheduler存储在如下字段中是否安全:
class TaskSchedulerReference {
private readonly _uiTaskScheduler;
// Constructor is called by the UI Thead
public TaskSchedulerReference() {
_uiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext()
}
public TaskScheduler UiTaskScheduler { get { return _uiTaskScheduler; } }
}
...这样就可以随时从Task.ContinueWith(action, TaskSchedulerReference.UiTaskScheduler)callback 中的任何后台线程通知UI。
是否保证引用在整个应用程序生命周期内保持有效?
【问题讨论】:
-
这个静态初始化器非常危险。请参考my answer,我在这里解释了这样的事情怎么会弄乱整个应用程序。不保证该字段会在 UI 线程上初始化。
-
请注意,这不是 SC,这是使用 SC 的
TaskScheduler。 -
请忘记静态初始化器。这不是重点。我更正了这个问题...
-
@dymanoid 不是很危险 :) - 有点随机,可以在任何特定时间从任何上下文调用,失败时会杀死类 - 但其他方面完全安全。
-
@i3arnon 谢谢,我解决了这个问题
标签: c# wpf asynchronous async-await