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

标签 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; } }
}

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

是否保证引用在整个应用程序生命周期内保持有效?

最佳答案

除了那个可疑的//UI线程首先访问这个类,是的。请改用显式初始化程序(从 UI 线程显式运行),JIT 不保证在 UI 线程上运行类初始化程序。

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

关于c# - 将 UI 线程的 TaskScheduler 存储在字段中是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28700781/

相关文章:

c# - 使用 TokenLookUpEdit 的 SelectedItems 填充 WPF Datagrid

ios - 如何使用 Alamofire 和 Rxswift 等待异步 api 响应?

java - 可能会抛出 "NullPointerException"; "context"在这里可以为空

javascript - 从 Promise : callback or promise? 返回一个值

c# - 为什么使用 xpath 获取属性失败?

java - 如何设置枚举类的数据类型?

c# - 将 INotifyPropertyChanged 添加到模型?

c# - 如何将图像设置为图表轴或沿图表轴设置?

wpf - 数组按数据网格上的位置绑定(bind) Xaml

c# - 如何从字符中添加字符