C# 线程冲突 调用目标无效

时间:2021-11-18 11:17:07
C#.NET 项目,用ManualResetEvent监视着一个操作Method_Loop()方法,这个Method_Loop()会周期性的调用,在Method_Loop()方法体内,调用了一个公用的方法static Common_A(),会调用底层的一些东西。正常情况会这样走。
但是,现在我都了其他的操作,在Method_Loop()方法正常运行的情况下,我新增的其他操作。

Thread th = new Thread(new ThreadStart(Method_Loop)); //循环调用,20s一次
MeasThread.Reset();
//其它略

private static Method_Loop()  //周期性的过程
{
  // .....
  //...
  调用了clsCom.Common_A()
}

///类
class clsCom
{
  public static void Common_A()
  {
     //...
     //....
     //调用底层的接口
  }
}

这时候我新添加一个操作,Test_Click()中也调用到了clsCom.Common_A()
public Test_Click()
{
   //code.....
   调用clsCom.Common_A()
}
如果我调试的情况下Test_Click()设置一个断点,一直跟踪下去跑完这个流程(从开始到调用完clsCom.Common_A()),没什么问题,达到了想要的效果。
但是,如果我直接运行Test_Click()方法,会抛出"调用的目标无效",应该是没有跑到clsCom.Common_A()中去,线程冲突了还是别的原因。。。
后来在想试用this.Invoke()委托调用clsCom.Common_A(),但是在类中这个好像不行,而且静态方法中没this,
后来又试着用
 public static void Common_A()
  {
     Lock(Object)
     {
         //调用底层的接口
      }
  }
或者用Mutex处理,都没有成功。

问题出在哪里,各位大侠知道的指点下,在线等待,先谢过了。。。。。




9 个解决方案

#1


Test_Click方法里,在调用clsCom.Common_A()前加一句WaitOne()方法等一下试试?

#2


通过互斥锁,使得一个线程在使用时候,其他所有的线程都无法使用

#4


引用 2 楼 wuyq11 的回复:
通过互斥锁,使得一个线程在使用时候,其他所有的线程都无法使用

今天有其他事情,还没去试你讲的建议。
不过发帖前我试过
 public static void Common_A()
  {
      bool canCreateNew;
      Mutex m = new Mutex(true, "test", out canCreateNew);
      if (canCreateNew)
      {
        //调用底层的接口
       }
      m.ReleaseMutex(); 
  }
没有成功,难道这种互斥锁做法不行,期待你的回答。。。。

#5


互斥锁  试过了 好像还是不行咯  难道是其它原因。。。

#6


我是这样写的,大家帮忙看看哪里写的不对,十分急用,谢谢大家了:

     //共享的互斥锁
     class shareRes
    {
        public static Mutex mutex = new Mutex();
    }
 
    //上面的循环过程调用的类
    class Thread_Loop
    {
        public Thread thrd;
        public Thread_Loop(string name)
        {
            thrd = new Thread(this.run);
            thrd.Name = name;
            thrd.Start();
        }
        void run()
        {
            shareRes.mutex.WaitOne();

           //.....调用公用方法
           调用了clsCom.Common_A()

            shareRes.mutex.ReleaseMutex();
        }
    }

   //Test_Click调用的类
   class Thread_Click
    {
        public Thread thrd;
        public Thread_Click(string name)
        {
            thrd = new Thread(this.run);
            thrd.Name = name;
            thrd.Start();
        }
        void run()
        {
            shareRes.mutex.WaitOne();
            
           //.....调用公用方法
            调用了clsCom.Common_A()

            shareRes.mutex.ReleaseMutex();
        }
    }

然后在调用的时候初始化

//周期性的过程,这个过程比Test_Click()先进行,它可能一直占用公用方法clsCom.Common_A()
private static Method_Loop() 
{
  // .....
  //...启动
  Thread_Loop mthrd1 = new Thread_Loop("Thread_Loop thread ");
  mthrd1.thrd.Join();

 }
 
 //我点击的事件发生,还想优先处理此事件
 public Test_Click()
{
  //code.....启动
  Thread_Click mthrd2 = new Thread_Click("Thread_Click thread ");
  mthrd2.thrd.Join();
}


    

#7


学习。帮顶

#8


怎么没人帮顶啊。。。

#9


已经发到你邮箱了。

#1


Test_Click方法里,在调用clsCom.Common_A()前加一句WaitOne()方法等一下试试?

#2


通过互斥锁,使得一个线程在使用时候,其他所有的线程都无法使用

#3


#4


引用 2 楼 wuyq11 的回复:
通过互斥锁,使得一个线程在使用时候,其他所有的线程都无法使用

今天有其他事情,还没去试你讲的建议。
不过发帖前我试过
 public static void Common_A()
  {
      bool canCreateNew;
      Mutex m = new Mutex(true, "test", out canCreateNew);
      if (canCreateNew)
      {
        //调用底层的接口
       }
      m.ReleaseMutex(); 
  }
没有成功,难道这种互斥锁做法不行,期待你的回答。。。。

#5


互斥锁  试过了 好像还是不行咯  难道是其它原因。。。

#6


我是这样写的,大家帮忙看看哪里写的不对,十分急用,谢谢大家了:

     //共享的互斥锁
     class shareRes
    {
        public static Mutex mutex = new Mutex();
    }
 
    //上面的循环过程调用的类
    class Thread_Loop
    {
        public Thread thrd;
        public Thread_Loop(string name)
        {
            thrd = new Thread(this.run);
            thrd.Name = name;
            thrd.Start();
        }
        void run()
        {
            shareRes.mutex.WaitOne();

           //.....调用公用方法
           调用了clsCom.Common_A()

            shareRes.mutex.ReleaseMutex();
        }
    }

   //Test_Click调用的类
   class Thread_Click
    {
        public Thread thrd;
        public Thread_Click(string name)
        {
            thrd = new Thread(this.run);
            thrd.Name = name;
            thrd.Start();
        }
        void run()
        {
            shareRes.mutex.WaitOne();
            
           //.....调用公用方法
            调用了clsCom.Common_A()

            shareRes.mutex.ReleaseMutex();
        }
    }

然后在调用的时候初始化

//周期性的过程,这个过程比Test_Click()先进行,它可能一直占用公用方法clsCom.Common_A()
private static Method_Loop() 
{
  // .....
  //...启动
  Thread_Loop mthrd1 = new Thread_Loop("Thread_Loop thread ");
  mthrd1.thrd.Join();

 }
 
 //我点击的事件发生,还想优先处理此事件
 public Test_Click()
{
  //code.....启动
  Thread_Click mthrd2 = new Thread_Click("Thread_Click thread ");
  mthrd2.thrd.Join();
}


    

#7


学习。帮顶

#8


怎么没人帮顶啊。。。

#9


已经发到你邮箱了。