【问题标题】:Running function from an unmanaged dll inside a C# thread从 C# 线程内的非托管 dll 运行函数
【发布时间】:2010-03-05 19:29:49
【问题描述】:

这是我的问题: 我有一个我制作的非托管 dll。我正在使用 PInvoke 在我的 C# 代码中调用这个 dll 的函数之一。 在某些情况下,在dll函数中,我希望能够终止正在运行该函数的线程。我该如何实现呢?

对不起,如果这是一个愚蠢的问题,但在线程方面我完全是菜鸟:)

【问题讨论】:

  • 你有一个长时间运行的线程,你想从另一个线程中杀死?或者您不知道如何清理已启动的线程?
  • 我正在一个单独的线程中运行一个有潜在危险的函数,以避免损坏我的主线程的堆栈。如果出现问题,我不确定如何将消息传递给主线程,所以我正在寻找一种方法来杀死损坏的线程。

标签: c# c++ multithreading


【解决方案1】:

伙计,这听起来很危险。为什么要终止线程?根据您编组呼叫的方式,您可能处于您不拥有的线程中。无论哪种方式,您最好的选择似乎是返回一些内容以表明您想要终止线程并让托管代码优雅地处理它。不要试图杀死本机代码中的线程。

【讨论】:

    【解决方案2】:

    如果我理解正确的话,你的情况是这样的(为了简洁,使用伪代码)

    C#
    ==
    
    Main()
    {
       StartNewThread(MyThread);
       DoStuff();
    }
    
    MyThread()
    {
        UnmanagedDll.DoSomething();
    }
    
    Unmanaged DLL
    =============
    DoSomething()
    {
        // Does something here
    }
    

    对吗?

    如果是这样,如果在调用 UnmanagedDll.DoSomething() 之后没有语句,则从 UnmanagedDll.DoSomething() 返回将导致调用线程终止。因此,只需将控制权返回给 C# 程序即可。

    如果这不是您的情况,请提供更多详细信息。

    【讨论】:

      【解决方案3】:

      我会从非托管 DLL 函数传回一个特殊结果并(检测到特殊返回值)终止 C# 中的线程。在 DLL 中终止它对我来说听起来是个坏主意。

      【讨论】:

        猜你喜欢
        • 2015-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-07
        • 1970-01-01
        • 2016-02-09
        • 2014-08-18
        相关资源
        最近更新 更多