.net - WinForms - 如何在不传递委托(delegate)的情况下从单独的线程访问/调用 UI 线程中的方法?

标签 .net winforms .net-3.5 multithreading quartz.net

问题 :在 .NET 3.5 WinForms 应用程序中,如何在不传递委托(delegate)的情况下从单独的线程访问/调用 UI 线程中的方法?

示例 :假设我有一些代码我想(a)在用户单击按钮时手动运行,以及(b)由在单独的非 mainUI 线程中运行但不传递委托(delegate)的进程定期调用。 [简单地说,我认为已经构造了具有此方法的类,并且主 UI 线程具有它的句柄,因此如果在单独线程中运行的进程可以从主 UI 中获取它的句柄线程它可以调用它。希望这不是一个有缺陷的概念]

背景 :我实际上是在为我的单独进程线程实际上是我使用quartz.net安排的工作的情况下执行上述操作的方法。调度程序的工作方式我似乎无法真正传递委托(delegate)。有一种方法可以传递 JobDetails,但它似乎只适合字符串、int 等。因此,我所追求的是一种访问 MainForm 类的方法,例如,从内部调用它的方法在单独的线程中运行的quartz.net 作业。

谢谢

最佳答案

假设您可以访问 MainForm,您可以简单地调用它的任何方法,但是这些方法将承担检查它们是否需要编码到 UI 线程并处理在那里传递的委托(delegate)的负担。

所以在你的主表单上你可以有一个方法:

public void UpdateProgress()
{
    if( this.InvokeRequired )
    {
        this.Invoke(UpdateProgress);
        return;
    }

    // do actual update of progress here
}

关于.net - WinForms - 如何在不传递委托(delegate)的情况下从单独的线程访问/调用 UI 线程中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2526725/

相关文章:

c# - List<MyClass> 作为 DropDownList 的数据源?

c# - 将音频转换为字符串(就像我们可以将图像转换为 Base64String 一样)?

.net - 线程池最多使用 200 个线程

css - 将样式表应用于 VB.net 表单控件

c# - 如何在没有 Winforms 的情况下使用 ClassLibrary 中的 ActiveX 组件

.net-3.5 - 如何找出哪些进程锁定了文件夹或文件?

c# - 在文件流传输中实现停止和重新启动 - 如何实现? C# 网络

c# - .NET 应用程序需要微秒级延迟来限制 UDP 多播传输速率

c# - 在我的代码执行中添加延迟的正确方法

c# - 如何忽略 [XMLIgnore] 属性