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

时间:2017-06-13 11:26:24

标签: c# multithreading

我有一个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的哪些属性可能导致此类行为?

提前谢谢

1 个答案:

答案 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");
    }
}