代码之家  ›  专栏  ›  技术社区  ›  chiccodoro

如何在不引用窗体的情况下使用ISynchronizeInvoke

  •  6
  • chiccodoro  · 技术社区  · 15 年前

    Invoke Form ISynchronizeInvoke 接口:

    public class MyForm : Form
    {
        ...
        private void Button_Click(object sender, EventArgs e)
        {
            SomeExcelWorkbook.OnBeforeClose += delegate(ref bool Cancel)
            {
                this.Invoke(someCode);
            };
        }
    }
    

    public void CodeExecutedByUIThread()
    {
        ISynchronizeInvoke sync;
        SomeExcelWorkbook.OnBeforeClose += delegate(ref bool Cancel)
        {
            sync.Invoke(someCode);
        };
    }
    

    进入时 CodeExecutedByUIThread ,我们仍然在UI线程中,所以理论上所有需要的东西都应该在那里。不幸的是 Form is the only class implementing that interface ,是吗?

    我怎样才能拿到一张支票 显然 Thread.CurrentThread 不提供它。。。

    SynchronizationContext ? 我该如何检索和使用它?

    更新: 哦,我明白了,获取SynchronizationContext对象看起来很简单 SynchronizationContext.Current ,它不需要任何对窗体的引用。所以我会在谷歌上搜索更多关于如何使用它的信息。

    1 回复  |  直到 9 年前
        1
  •  2
  •   matiash    15 年前

    总的来说,我认为两者都不可能。

    这似乎是一个显而易见的答案,但我们在本例中使用的是在应用程序启动时将SynchronizationContext和对表单的引用(作为ISynchronizeInvoke)存储在静态类中。

    MainForm main = new MainForm();
    EnvironmentService.UI = main;
    EnvironmentService.UIContext = SynchronizationContext.Current;
    Application.Run(main);