gpt4 book ai didi

c# - SynchronizationContext 在 winforms 中为空

转载 作者:太空宇宙 更新时间:2023-11-03 10:33:36 25 4
gpt4 key购买 nike

我正在创建一个依赖于捕获 SynchronizationContext 的库,以便将回调发布回 UI 线程。

用户遇到了一个奇怪的情况,回调被发布到 ThreadPool。经过一番调查,我想出了以下两个测试用例:

1:

public partial class Form1 : Form
{
private Test test;

public Form1()
{
test = new Test();
InitializeComponent();
}

private class Test
{
public Test()
{
if (SynchronizationContext.Current == null)
throw new InvalidOperationException("It's null! :(");
}
}
}

2:

public partial class Form1 : Form
{
private Test test = new Test();

public Form1()
{
InitializeComponent();
}

private class Test
{
public Test()
{
if (SynchronizationContext.Current == null)
throw new InvalidOperationException("It's null! :(");
}
}
}

第一个测试运行正常,但第二个测试抛出异常。为什么?

最佳答案

在第二个示例中,new Test()(几乎)作为程序中的第一行代码运行。您的 Main 函数可能会调用 new Form1(),它会立即调用 new Test()

SynchronizationContext 必须在它出现之前设置(显然)。运行时没有什么神奇的东西可以猜测您的应用程序将使用 WinForms。使用 WinForms 是一个动态的运行时决定。当您使用 WinForms 时,WinForms 会设置它的 SynchronizationContext(我忘记了具体的触发点)。

在第一个示例中,base 构造函数 (new Form()) 首先运行,显然安装了 SynchronizationContext

当您在任何 WinForms 代码运行之前运行代码时,SynchronizationContext 将/不可能存在。

您的图书馆对此无能为力。您可以添加断言或手动设置 WinForms 同步上下文(有一个 API),但这几乎不是库的工作。图书馆不应该扰乱全局状态。 (除非您的库明确仅供 WinForms 使用)。

关于c# - SynchronizationContext 在 winforms 中为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28793383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com