0

我正在为用 VB6 编写的 EXE 制作 C# DLL 插件。我无法访问 EXE 的源代码。DLL 本身可以正常工作并与 EXE 通信良好。

这是一个事件的过程:

  1. 用户在 EXE 上发出命令,然后调用 DLL 中的函数,将对象作为参数传递
  2. DLL 处理有时需要很长时间的数据
  3. DLL 通过调用传递的对象的函数来响应。DLL 函数本身不返回任何内容

    public void DoCommand(object CommandSettings)
    {
        //ObjectVB6 is my custom class to allow easy calling of COM methods and properties
        ObjectVB6 CS = new ObjectVB6(CommandSettings);
        ... //process data
        CS.CallMethod("MyReply", args);
    }
    

我的问题是在长查询期间(来自 DLL),EXE 的 UI 冻结。

防止这种情况的最佳方法是什么?我曾尝试使用异步 MySQL 查询,但效果不佳,并尝试使用多个线程,这只是遇到受保护的内存问题。

你能提供的任何建议都会很棒。几天来一直试图解决这个问题。谢谢。

4

5 回答 5

1

尝试以下操作:

BackgroundWorker bw = null; 
ObjectVB6 CS = null;

public void DoCommand(object CommandSettings)
{
    //ObjectVB6 is my custom class to allow easy calling of COM methods and properties
    CS = new ObjectVB6(CommandSettings);

    // hook up background worker
    bw = new BackgroundWorker();
    bw.DoWork += new DoWorkEventHandler(bw_DoWork);
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}

private void bw_DoWork(...)
{
    // process data, e.g. the piece that takes too long
}

private void bw_RunWorkerCompleted
{
   CS.CallMethod("MyReply", args);
}

就像其中一位响应者所说的那样,由于 VB6 单元线程的性质,这可能会也可能不会起作用。

于 2009-11-27T04:57:54.230 回答
0

为什么不能只为该代码使用工作线程?您遇到了哪些“受保护的内存问题”?

于 2009-11-26T20:33:50.773 回答
0

IMO 处理此问题的最佳方法是将您的请求放入ThreadPoolDLL 端,“即发即弃”的风格。你试过这个吗?

否则,您将不得不为您的 VB6 程序设置一个回调函数来获取状态,正如您可能已经发现的那样,由于 VB6 的单线程单元模型,这很棘手。

如果您想更深入地探索 VB6 中多线程的利弊,请查看以下文章。它可能允许您简单地启动一个线程并在 VB6 端执行它:

VB5 和 VB6 中的多线程
http://www.freevbcode.com/ShowCode.Asp?ID=1287

于 2009-11-26T20:37:54.540 回答
0

在 .NET 中开发的所有函数都可以使用委托异步调用,然后调用 BeginInvoke 来实际调用该函数。由于您的函数不返回任何内容,因此您无需调用 EndInvoke。通过使用 IAsyncResult,您可以满足您的回调要求。关于如何正确执行此操作的一个很好的参考是 O'Reilly 出版的 Juval Lowy 的“Programming .NET Components”。ISBN 是 0596102070。祝你好运。

于 2009-11-26T21:24:45.707 回答
0

我想出了一种方法来完成我所追求的。虽然我更喜欢更好的方法,但这种方法很有效。

使用两个队列来共享信息。主线程监听获取_get队列,并在请求时设置_set队列。工作线程简单地将请求插入 _get 队列,并等待 _set 准备好。主线程就像代理一样。

谢谢你的帮助!

于 2009-11-27T00:52:55.020 回答