我目前正在调查Thread.Interrupt如何与P / Invoke或本机调用一起播放。我在MSDN中读过,不能中止(Thread.Abort)本机调用中的线程(其他用例也可能适用)。但我没有找到任何对WaitSleepJoin状态的本机线程有相同的引用。
这个问题不是关于是否应该调用Abort或Interrupt,而是关于我在哪里可以找到关于此问题的授权文档。 G-ing没有提供任何有用的输出。
我的测试示例:
#ifdef NATIVEFUNCTIONS_EXPORTS
#define NATIVEFUNCTIONS_API __declspec(dllexport)
#else
#define NATIVEFUNCTIONS_API __declspec(dllimport)
#endif
#include <iostream>
extern "C"
{
NATIVEFUNCTIONS_API void EndlessWait(char const* mutexName)
{
std::cout << "entering the endless wait." << std::endl;
HANDLE mutex = CreateMutex(NULL, FALSE, mutexName);
WaitForSingleObject(mutex, INFINITE);
std::cout << "leaving the endless wait." << std::endl;
}
};
Native C ++ - 导出函数的DLL,它无休止地等待互斥锁。
现在是C#.NET对应物,试图取消等待:
using System;
using System.Threading;
using System.Runtime.InteropServices;
namespace InterruptingNativeWaitingThread
{
class Program
{
[DllImport("NativeFunctions.dll", CharSet=CharSet.Ansi)]
static extern void EndlessWait(string str);
static void Main(string[] args)
{
string mutexName = "interprocess_mutex";
Mutex m = new Mutex(false, mutexName);
m.WaitOne();
Thread t = new Thread(() => { EndlessWait(mutexName); });
t.Start();
Thread.Sleep(1000);
t.Abort();
if(!t.Join(5000))
Console.WriteLine("Unable to terminate native thread.");
t.Interrupt();
if(!t.Join(5000))
Console.WriteLine("Unable to interrupt the native wait.");
Console.WriteLine("Release the mutex.");
m.ReleaseMutex();
t.Join();
}
}
}
执行此应用程序会产生以下输出:
entering the endless wait.
Unable to terminate native thread.
Unable to interrupt the native wait.
Release the mutex.
leaving the endless wait.
Abort在预期的上下文中不起作用,但是msdn没有说出关于中断的话。我希望它一方面可以工作:因为托管线程处于Wait状态也会调用本机WaitForSingleObject或WaitForMultipleObjects;另一方面,被中断的本机线程有可能不支持所有预期的异常,比什么?
非常欢迎任何文件!
非常感谢,
Ovanes
P.S。我还在MSDN中发现中止等待,直到要中止的线程从非托管代码返回,如果线程处于WaitSleepJoin状态,则首先调用中断,然后中止它。但这并不意味着中断不能中断本机WaitSleepJoin。
答案 0 :(得分:2)
我怀疑该线程处于WaitSleepJoin状态;记录中断仅在此状态下中断线程。查看线程的ThreadState属性以验证它所处的状态。