【发布时间】:2012-11-15 03:41:01
【问题描述】:
我编写了一个 C# DLL COM 库,它可以通过 VBScript 访问。所有库的东西都写在主程序中,没有任何形式。
后来我添加了一个只显示状态的表单(如“49% 完成”)。这工作得很好,但是当 DLL 必须计算很多东西时,表单会“挂起”。我希望表单始终可以访问和移动。
所以我决定为表单创建一个自己的线程。创建线程和表单很容易,但是从主程序访问此表单时我遇到了很大的问题。例如,我只想设置标题。
我这样称呼表格:
namespace PART1.PART2
{
public class CLASSNAME
{
private Thread fStatus;
private frm_Status fStatusForm;
public void runShowStatus()
{
if (fStatus == null)
{
fStatus = new Thread(new ThreadStart(threadForm));
fStatus.Start();
}
}
private void threadForm()
{
fStatusForm = new frm_Status();
Application.Run(fStatusForm);
}
}
}
表单本身是标准表单。目前没有特殊代码。
有类似的帖子,但有两个主要区别:
- 表单在线程中 - 表单不在主程序中,并且表单不是主表单。
- 主程序尝试访问表单 - 表单不尝试访问主程序。
【问题讨论】:
-
你变得越来越糟,VBScript 根本不支持线程。使用 BackgroundWorker 执行昂贵的计算,它的 ReportProgress 方法来更新 UI。
-
感谢您的回复。我对BackgroundWorker一无所知。也许你能给我举个例子? VBScript 不访问表单或任何其他线程。它甚至不知道还有另一个线程。 (这是有意的)
-
谷歌点击量半百万,从顶部开始。
-
我用一个非常简单的方法解决了这个问题。甚至没有必要对我的线程或调用者进行任何更改。我刚刚添加了一个名为“状态”的新类。全局创建了一个实例。现在我可以从主线程和子线程访问这个类的成员了。
标签: c# multithreading com