C# 等待线程结束后执行下面的程序

时间:2023-01-20 08:35:49
               

bool goon = true;   //是否继续执行随后的程序
public void Main()
{
 Thread staThread = new Thread(new ThreadStart(GetData()));    //GetData() 是一个
                staThread.SetApartmentState(ApartmentState.STA);
                staThread.Start();
                //下面代码的意图:希望等这个GetData() 执行结束后再执行Excute()方法
                while (staThread.ThreadState == ThreadState.Running)
                {
                    goon = false;    //按我的想法,GetData()未执行完前 应该是在这儿一直循环
                }
                 goon = true;

                if(goon )Excute();     /

}
//这是一个调用SAP接口取数的方法
public void GetData()
{
    //code...
     
}

public void Excute()
{
    //code...
}

17 个解决方案

#1


你要在线程处理完后执行stop()撒

#2


你直接在 public void GetData()
这个函数的最后面再call Excute()
不就行了吗?

#3



bool goon = true;   //是否继续执行随后的程序
public void Main()
{
 Thread staThread = new Thread(new ThreadStart(GetData()));    //GetData() 是一个
                staThread.SetApartmentState(ApartmentState.STA);
                staThread.Start();
                //下面代码的意图:希望等这个GetData() 执行结束后再执行Excute()方法
                while (staThread.ThreadState == ThreadState.Running)
                {
                    goon = false;    //按我的想法,GetData()未执行完前 应该是在这儿一直循环
                       Thread.Sleep(100);
                }
                 goon = true;

                if(goon )Excute();     /

}
//这是一个调用SAP接口取数的方法
public void GetData()
{
    //code...
     
}

public void Excute()
{
    //code...
}


你这里是一个死循环,现程根本无法执行,加一句: Thread.Sleep(100);

#4


SetApartmentState是在线程开始前设置状态.
可以用信号量 new object()或者begininvoke异步执行。

delegate void Get();
public void Main()
{
   Get get = Getdata;
   get.begininvoke(new new AsyncCallback(Endget), null);
}
public void Getdata()
{ }
public void Endget(IAsyncResult result)
{
      System.Runtime.Remoting.Messaging.AsyncResult iasr =(System.Runtime.Remoting.Messaging.AsyncResult)result;
      Get gd= (Get)iasr.AsyncDelegate;
      Gd.EndInvoke(result);
      //这里加入Excute()方法的内容或调用该方法
}

#5



引用 3 楼 patrickpan 的回复:
C# codebool goon=true;//是否继续执行随后的程序publicvoid Main()
{
 Thread staThread=new Thread(new ThreadStart(GetData()));//GetData() 是一个                staThread.SetApartmentState(ApartmentState.STA);
                staThread.Start();//下面代码的意图:希望等这个GetData() 执行结束后再执行Excute()方法while (staThread.ThreadState== ThreadState.Running)
                {
                    goon=false;//按我的想法,GetData()未执行完前 应该是在这儿一直循环                       Thread.Sleep(100);
                }
                 goon=true;if(goon )Excute();/

}//这是一个调用SAP接口取数的方法publicvoid GetData()
{//code...     
}publicvoid Excute()
{//code...}
你这里是一个死循环,现程根本无法执行,加一句: Thread.Sleep(100);


这个已经试过了,不行!跟不加的效果是一样的,有时候能执行成功,有时候不行

#6



class Program
    {
        static Object obj = new Object();
        static void Main(string[] args)
        {
            Thread staThread = new Thread(new ThreadStart(GetData));
            staThread.SetApartmentState(ApartmentState.STA);
            staThread.Start();

            Excute();

            Console.Read();
        }

        static void GetData()
        {
            Monitor.Enter(obj);
            Console.WriteLine("Get Data...");
            Thread.Sleep(5000);
            Console.WriteLine("Geted Data");
            Monitor.Pulse(obj);
            Monitor.Exit(obj);
        }

        static void Excute()
        {
            Monitor.Enter(obj);
            Monitor.Wait(obj);
            Console.WriteLine("Excuting...");
            Thread.Sleep(1000);
            Console.WriteLine("Excuted");
            Monitor.Exit(obj);
        }
    }

#7


http://www.albahari.com/threading/

#8


softcoke_320的基本上正确,有一行代码需要去掉 
static void Excute()
        {
            Monitor.Enter(obj);
            //Monitor.Wait(obj);
.....}
下面是最终解决方法的代码,以供有相同问题的朋友查询

class Program
    {
        static Object obj = new Object();
        static void Main(string[] args)
        {
            Thread staThread = new Thread(new ThreadStart(GetData));
            staThread.SetApartmentState(ApartmentState.STA);
            staThread.Start();

            Excute();

            Console.Read();
        }

        static void GetData()
        {
            Monitor.Enter(obj);
            Console.WriteLine("Get Data...");
            Thread.Sleep(5000);
            Console.WriteLine("Geted Data");
            Monitor.Pulse(obj);
            Monitor.Exit(obj);
        }

        static void Excute()
        {
            Monitor.Enter(obj);
            //Monitor.Wait(obj);     //需要去掉这行
            Console.WriteLine("Excuting...");
            Thread.Sleep(1000);
            Console.WriteLine("Excuted");
            Monitor.Exit(obj);
        }
    }



#9


引用 8 楼 yuemb369 的回复:
softcoke_320的基本上正确,有一行代码需要去掉
 static void Excute()
         {
             Monitor.Enter(obj);
             //Monitor.Wait(obj);
 .....}
 下面是最终解决方法的代码,以供有相同问题的朋友查询

你好 这行代码可以保证 GetData方法可以先于Excute方法执行 也可以保证Excute方法在其结束后才开始执行 如果去掉 并无法保证GetData方法先获得锁 可能会是Excute先执行

#10


楼主的情况不需要使用Monitor啊。
如果Excute可以与GetData在同一个线程执行,则在GetData的最后调用Excute即可。
如果不行,则在GetData的最后,把Excute封送到原线程执行即可。

#11


引用 10 楼 robinwjb 的回复:
楼主的情况不需要使用Monitor啊。
如果Excute可以与GetData在同一个线程执行,则在GetData的最后调用Excute即可。
如果不行,则在GetData的最后,把Excute封送到原线程执行即可。


对,这也是一种解决办法,Monitor,楼上这个,和异步都是可以解决的。

#12


还有一点未说明,我的这个程序必须得使用线程.所以只能是线程


引用 11 楼 lizhibin11 的回复:
引用 10 楼 robinwjb 的回复:
楼主的情况不需要使用Monitor啊。
如果Excute可以与GetData在同一个线程执行,则在GetData的最后调用Excute即可。
如果不行,则在GetData的最后,把Excute封送到原线程执行即可。


对,这也是一种解决办法,Monitor,楼上这个,和异步都是可以解决的。

#13


异步就是多线程哦

#14


我以前没用过线程,有些知识点不清楚
引用 13 楼 lizhibin11 的回复:
异步就是多线程哦

#15


@softcoke_320的方法有时会失效.
只有Excute()的Monitor.Enter(obj)方法先执行时才有效,否则就死锁了.

#16


遇到同样的问题,过来study一下~~

#17


还在用Thread创建线程???

#1


你要在线程处理完后执行stop()撒

#2


你直接在 public void GetData()
这个函数的最后面再call Excute()
不就行了吗?

#3



bool goon = true;   //是否继续执行随后的程序
public void Main()
{
 Thread staThread = new Thread(new ThreadStart(GetData()));    //GetData() 是一个
                staThread.SetApartmentState(ApartmentState.STA);
                staThread.Start();
                //下面代码的意图:希望等这个GetData() 执行结束后再执行Excute()方法
                while (staThread.ThreadState == ThreadState.Running)
                {
                    goon = false;    //按我的想法,GetData()未执行完前 应该是在这儿一直循环
                       Thread.Sleep(100);
                }
                 goon = true;

                if(goon )Excute();     /

}
//这是一个调用SAP接口取数的方法
public void GetData()
{
    //code...
     
}

public void Excute()
{
    //code...
}


你这里是一个死循环,现程根本无法执行,加一句: Thread.Sleep(100);

#4


SetApartmentState是在线程开始前设置状态.
可以用信号量 new object()或者begininvoke异步执行。

delegate void Get();
public void Main()
{
   Get get = Getdata;
   get.begininvoke(new new AsyncCallback(Endget), null);
}
public void Getdata()
{ }
public void Endget(IAsyncResult result)
{
      System.Runtime.Remoting.Messaging.AsyncResult iasr =(System.Runtime.Remoting.Messaging.AsyncResult)result;
      Get gd= (Get)iasr.AsyncDelegate;
      Gd.EndInvoke(result);
      //这里加入Excute()方法的内容或调用该方法
}

#5



引用 3 楼 patrickpan 的回复:
C# codebool goon=true;//是否继续执行随后的程序publicvoid Main()
{
 Thread staThread=new Thread(new ThreadStart(GetData()));//GetData() 是一个                staThread.SetApartmentState(ApartmentState.STA);
                staThread.Start();//下面代码的意图:希望等这个GetData() 执行结束后再执行Excute()方法while (staThread.ThreadState== ThreadState.Running)
                {
                    goon=false;//按我的想法,GetData()未执行完前 应该是在这儿一直循环                       Thread.Sleep(100);
                }
                 goon=true;if(goon )Excute();/

}//这是一个调用SAP接口取数的方法publicvoid GetData()
{//code...     
}publicvoid Excute()
{//code...}
你这里是一个死循环,现程根本无法执行,加一句: Thread.Sleep(100);


这个已经试过了,不行!跟不加的效果是一样的,有时候能执行成功,有时候不行

#6



class Program
    {
        static Object obj = new Object();
        static void Main(string[] args)
        {
            Thread staThread = new Thread(new ThreadStart(GetData));
            staThread.SetApartmentState(ApartmentState.STA);
            staThread.Start();

            Excute();

            Console.Read();
        }

        static void GetData()
        {
            Monitor.Enter(obj);
            Console.WriteLine("Get Data...");
            Thread.Sleep(5000);
            Console.WriteLine("Geted Data");
            Monitor.Pulse(obj);
            Monitor.Exit(obj);
        }

        static void Excute()
        {
            Monitor.Enter(obj);
            Monitor.Wait(obj);
            Console.WriteLine("Excuting...");
            Thread.Sleep(1000);
            Console.WriteLine("Excuted");
            Monitor.Exit(obj);
        }
    }

#7


http://www.albahari.com/threading/

#8


softcoke_320的基本上正确,有一行代码需要去掉 
static void Excute()
        {
            Monitor.Enter(obj);
            //Monitor.Wait(obj);
.....}
下面是最终解决方法的代码,以供有相同问题的朋友查询

class Program
    {
        static Object obj = new Object();
        static void Main(string[] args)
        {
            Thread staThread = new Thread(new ThreadStart(GetData));
            staThread.SetApartmentState(ApartmentState.STA);
            staThread.Start();

            Excute();

            Console.Read();
        }

        static void GetData()
        {
            Monitor.Enter(obj);
            Console.WriteLine("Get Data...");
            Thread.Sleep(5000);
            Console.WriteLine("Geted Data");
            Monitor.Pulse(obj);
            Monitor.Exit(obj);
        }

        static void Excute()
        {
            Monitor.Enter(obj);
            //Monitor.Wait(obj);     //需要去掉这行
            Console.WriteLine("Excuting...");
            Thread.Sleep(1000);
            Console.WriteLine("Excuted");
            Monitor.Exit(obj);
        }
    }



#9


引用 8 楼 yuemb369 的回复:
softcoke_320的基本上正确,有一行代码需要去掉
 static void Excute()
         {
             Monitor.Enter(obj);
             //Monitor.Wait(obj);
 .....}
 下面是最终解决方法的代码,以供有相同问题的朋友查询

你好 这行代码可以保证 GetData方法可以先于Excute方法执行 也可以保证Excute方法在其结束后才开始执行 如果去掉 并无法保证GetData方法先获得锁 可能会是Excute先执行

#10


楼主的情况不需要使用Monitor啊。
如果Excute可以与GetData在同一个线程执行,则在GetData的最后调用Excute即可。
如果不行,则在GetData的最后,把Excute封送到原线程执行即可。

#11


引用 10 楼 robinwjb 的回复:
楼主的情况不需要使用Monitor啊。
如果Excute可以与GetData在同一个线程执行,则在GetData的最后调用Excute即可。
如果不行,则在GetData的最后,把Excute封送到原线程执行即可。


对,这也是一种解决办法,Monitor,楼上这个,和异步都是可以解决的。

#12


还有一点未说明,我的这个程序必须得使用线程.所以只能是线程


引用 11 楼 lizhibin11 的回复:
引用 10 楼 robinwjb 的回复:
楼主的情况不需要使用Monitor啊。
如果Excute可以与GetData在同一个线程执行,则在GetData的最后调用Excute即可。
如果不行,则在GetData的最后,把Excute封送到原线程执行即可。


对,这也是一种解决办法,Monitor,楼上这个,和异步都是可以解决的。

#13


异步就是多线程哦

#14


我以前没用过线程,有些知识点不清楚
引用 13 楼 lizhibin11 的回复:
异步就是多线程哦

#15


@softcoke_320的方法有时会失效.
只有Excute()的Monitor.Enter(obj)方法先执行时才有效,否则就死锁了.

#16


遇到同样的问题,过来study一下~~

#17


还在用Thread创建线程???