C# 从线程中的外部 DLL 获取事件时出现问题



我有一个C# WPF桌面应用程序,它使用外部DLL来控制设备。

连接到外部 DLL是通过如下事件完成的(服务对象是外部 DLL 的一部分):

public void Init()
{
service = new Service("service");
service.Connected += new EventHandler(ServiceConnected);    
service.Connect();
}
private void ServiceConnected(object sender, EventArgs e)
{
//do more stuff
}

只要我从主线程调用,这就可以工作。显然,我不希望DLL阻止主线程和UI线程。所以我想把设备 DLL 的工作放在它自己的线程中。

private Device device;
...
deviceThread = new Thread(new ThreadStart(InitializeThread));
deviceThread.IsBackground = true;
deviceThread.Start();
...
private void InitializeThread()
{
device = Device.MyDevice;
device.Init();
logger.Debug("Waiting for work . . .");
while (running)
{
if (work != null)
{
work();
work = null;
}
}
}

但是当我尝试像以前一样连接到 DLL 时,事件服务连接永远不会被线程捕获。唯一的区别是 Init() 调用是从新线程完成的。

该设备在我的代码中是单例:

private Device()
{
}
public static Device MyDevice
{
get
{
return Nested.instance;
}
}
private class Nested
{
static Nested()
{
}
internal static readonly Device instance = new Device();
}

为什么 DLL 在自己的线程中不起作用? 我的代码中有原因吗? 外部 DLL 的哪些属性可能导致此类行为?

提前感谢

我用一个简单的服务存根做了这个简单的测试,事件被捕获了。也许你想做一些不同的事情?

public partial class Form1 : Form
{
private Device device;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Thread deviceThread = new Thread(new ThreadStart(InitializeThread));
deviceThread.IsBackground = true;
deviceThread.Start();
}
private void InitializeThread()
{
device = Device.MyDevice;
device.Init();
/*
while (running)
{
if (work != null)
{
work();
work = null;
}
}
*/
}
}
class Service
{
public event EventHandler Connected;
public Service(string name)
{
}
public void Connect()
{
System.Threading.Thread.Sleep(2000);
Connected(this, new EventArgs());
}
}
class Device
{
private Device()
{
}
public static Device MyDevice
{
get
{
return Nested.instance;
}
}
private class Nested
{
static Nested()
{
}
internal static readonly Device instance = new Device();
}
public void Init()
{
Service service = new Service("service");
service.Connected += new EventHandler(ServiceConnected);
service.Connect();
}
private void ServiceConnected(object sender, EventArgs e)
{
//do more stuff
Console.WriteLine("ServiceConnected");
}
}

最新更新