将线程的TaskScheduler存储在字段中是否安全?

jer*_*erg 2 c# wpf asynchronous async-await

将UI线程的TaskScheduler存储在字段中是否安全,如下所示:

class TaskSchedulerReference {

    private readonly _uiTaskScheduler; 

    // Constructor is called by the UI Thead 
    public TaskSchedulerReference() {
        _uiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext()
    }

    public TaskScheduler UiTaskScheduler { get { return _uiTaskScheduler; } }
}
Run Code Online (Sandbox Code Playgroud)

...这样就可以随时从Task.ContinueWith(action, TaskSchedulerReference.UiTaskScheduler)回调中的任何后台线程通知UI .

是否保证在整个应用程序生命周期中引用仍然有效?

Lua*_*aan 5

除了那个可疑的// This class is first visited by the UI Thread,是的.使用显式初始化程序(显式地从UI线程运行),JIT不保证在UI线程上运行类初始化程序.

但是,我更喜欢将上下文捕获为局部变量.在多线程(和异步编程)中暴露任何全局状态都很棘手.始终尝试尽可能使用本地状态.它也充满了旧IsInvokeRequired模式.每个方法都应该非常明确地说明在哪里发生 - 否则很容易意外地引入重入代码和死锁.