我有一个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之前,事件ServiceConnected从未在线程中被捕获。唯一的区别是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的哪些属性可能导致此类行为?
提前谢谢
答案 0 :(得分:1)
我使用简单的服务存根进行了这个简单的测试,并捕获了事件。也许你想做一些不同的事情?
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");
}
}