线程
Thread td = new Thread(new ThreadStart(TestMethod));
td.Isbackground = true;
td.Start();void TestMethod()
{
  ......
  CallOtherComputer();//调用另外一台设备上的接口方法}现在碰到一个这样的问题,td线程在调用TestMethod时,CallOtherComputer方法操作导致被调用的设备死机,这个时候由于线程进入到这个方法后没有返回,导致调用的线程出现异常,请问有什么办法能够避免这样的问题吗?例如线程超时之类的,如果我的线程去调用一个方法,这个方法在3秒之内没有返回结果我就退出这个线程,然后继续做其他的工作,请问该如何来实现?
谢谢。

解决方案 »

  1.   

    api方法waitforsingleobject,他可以等待线程一定时间,然后返回
      

  2.   

    设置个延时试试,隔几毫秒再执行。Thread.sleep("延时时间")
      

  3.   


    private AutoResetEvent _autoReset = new AutoResetEvent(false);
    //启动线程
    Thread td = new Thread(new ThreadStart(TestMethod));
    td.Isbackground = true;
    td.Start();
    //判超时
    if (!_autoReset.WaitOne(2000, false))//超时时间设为2000毫秒,即2秒
    {
          MessageBox.Show("超时");
    }
    else
    {
          MessageBox.Show("未超时");
    }void TestMethod()
    {
      ......
      CallOtherComputer();//调用另外一台设备上的接口方法
      _autoReset.Set();//通知线程完成
    }
      

  4.   

    我觉得上面的说法没有错,楼主这个原因应该是CallOtherComputer()方法执行后异常或其他原因导致线程死锁。2楼的说法是先sleep一段时间然后再让线程执行。如果楼主不想终止线程,而是想尽可能的让线程顺利的完成任务的话可以这样试试。Thread td = new Thread(new ThreadStart(TestMethod));
    td.Isbackground = true;
    td.Start();
    t1.Interrupt();//这个比较重要,重新唤醒阻塞的线程
    void TestMethod()
    {
      ......
      CallOtherComputer();//调用另外一台设备上的接口方法
      try
      {
          Thread.Sleep(3000);
      }
      catch (System.Threading.ThreadInterruptedException e)
      {
         Console.WriteLine(e);
      }}
      

  5.   

    上面少了一个set()
    void TestMethod()
    {
      ......
      CallOtherComputer();//调用另外一台设备上的接口方法
      try
      {
      Thread.Sleep(3000);
      }
      catch (System.Threading.ThreadInterruptedException e)
      {
      Console.WriteLine(e);
      }
    td.set();
    }
      

  6.   

    Thread.Sleep(ServicePointManager.MaxServicePointIdleTime);
    查下这个。
      

  7.   

    一个笨办法,在线程中调线程private void test1()
            {
                System.Threading.Thread myThread = new System.Threading.Thread(new System.Threading.ThreadStart(test2));
                myThread.IsBackground = true;
                myThread.Start();
            }        bool runFlag = false;
            bool endFlag = false;
            private void test2()
            {
                runFlag = false;
                endFlag = false;
                System.Threading.Thread myThread = new System.Threading.Thread(new System.Threading.ThreadStart(test3));
                myThread.IsBackground = true;
                myThread.Start();            while (true)
                {
                    if (runFlag)
                    {
                        System.Threading.Thread.Sleep(3000);//等3秒                    if (!endFlag)
                        {
                            myThread.Abort();
                        }
                        break;
                    }
                }
            }        private void test3()
            {
                runFlag = true;            //---------------------模拟CallOtherComputer()
                int i = 0;
                int count = 1000 * 30;
                while ((i += 1000) < count)
                {
                    System.Threading.Thread.Sleep(1000);
                }
                //---------------------            endFlag = true;
            }
      

  8.   

    多谢大家,现在要考虑执行时间和程序的正常运行,sleep和abort都不可能