我现在在一个程序中调用的一个dll,一次只能被一个线程调用,如何实现可以并发调用该dll,windows环境下,用多进程编程吗?多进程的资源比较少,谁有一个例子能参考一下啊?
采用多线程编程,但是还是不能被并发调用。
希望各位大神们提宝贵意见!谢谢!

解决方案 »

  1.   

    每个线程调用dll时,dll都会在该线程内映射一份自己,所以无所谓一次几个线程去调用的问题
      

  2.   

    没有办法,那是你的dll开发时选择的线程模式的问题,如果多线程调用它就会使得它崩溃。唯一的办法就是删除它,你使用.net重新写,或者让作者重新写。
      

  3.   

    楼主 给你一个多线程编程的例子  第一个是按钮事件private void btnDataUp_Click(object sender, RoutedEventArgs e)
    {
                Thread thread = new Thread(GetDataUp);  //创建一个线程   其中GetDataUp是该线程要执行的方法
                thread.Start();                         //该线程运行  无论上述线程是否执行完毕都继续执行一下代码
                lblUpdateMessage.Visibility = Visibility.Visible;
    }
    private void GetDataUp()
            {
                    //执行的代码
                    Action action; //封装一个方法  该方法不具备参数并且不返回值                 action = () =>
                    {
                        //执行的代码
                    };
                    btnDataUp.Dispatcher.BeginInvoke(DispatcherPriority.SystemIdle, action);  //关联的线程上异步执行委托 执行Action方法         
               
            }
      

  4.   

    给你个多线程的例子private void btnDataUp_Click(object sender, RoutedEventArgs e)
    {
                Thread thread = new Thread(GetDataUp);  //创建一个线程   其中GetDataUp是该线程要执行的方法
                thread.Start();   
              txb.Text="我先看到效果";  //文本框
    }
    private void GetDataUp()
            {
                    //执行的代码
                    Action action; //封装一个方法  该方法不具备参数并且不返回值                  action = () =>
                    {
                        Thread.Sleep(5000);
                        MessageBox.Show("我第二显示出来");                };
                    btnDataUp.Dispatcher.BeginInvoke(DispatcherPriority.SystemIdle, action);  //关联的线程上异步执行委托 执行Action方法         
               
            }
      

  5.   

    用我上面的代码 自己建一个按钮和文本框就知道了(注意控件的命名)  我只是给个多线程编程的例子 至于你说调用dll 我还真没常识过
      

  6.   

    我也刚看明白,Lz说的不是每个进程load dll只有一个实例的问题,而是dll函数中做了线程访问数量控制
    如果不是进程级的锁,到可以用多进程实现
    例如
         ProcessStartInfo psi = new ProcessStartInfo();
        psi.FileName = @"D:\test.exe";
        Process.Start(psi);
    如果是只能重写了
      

  7.   

    省事的办法(下下策),多复制几个DLL,dll1,dll2等,弄个全局变量计数。不知道是否可行,
      

  8.   

    多进程可以解决.任务A 可以用多线程解决 同时也可以用多进程解决.比如写一个控制程序 来控制 工作程序1,工作程序2,工作程序3 ;
    程序间通信模式采取 回环地址socket这样工作程序1,2,3...  每个各自使用单线程启动自己的DLL.
    这不就搞定了么.
      

  9.   

    你有搞多进程再封装这个dll的闲工夫还不如重写一个...