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()
不就行了吗?
这个函数的最后面再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()方法的内容或调用该方法
}
可以用信号量 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
这个已经试过了,不行!跟不加的效果是一样的,有时候能执行成功,有时候不行
#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);
.....}
下面是最终解决方法的代码,以供有相同问题的朋友查询
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
你好 这行代码可以保证 GetData方法可以先于Excute方法执行 也可以保证Excute方法在其结束后才开始执行 如果去掉 并无法保证GetData方法先获得锁 可能会是Excute先执行
#10
楼主的情况不需要使用Monitor啊。
如果Excute可以与GetData在同一个线程执行,则在GetData的最后调用Excute即可。
如果不行,则在GetData的最后,把Excute封送到原线程执行即可。
如果Excute可以与GetData在同一个线程执行,则在GetData的最后调用Excute即可。
如果不行,则在GetData的最后,把Excute封送到原线程执行即可。
#11
对,这也是一种解决办法,Monitor,楼上这个,和异步都是可以解决的。
#12
还有一点未说明,我的这个程序必须得使用线程.所以只能是线程
#13
异步就是多线程哦
#14
我以前没用过线程,有些知识点不清楚
#15
@softcoke_320的方法有时会失效.
只有Excute()的Monitor.Enter(obj)方法先执行时才有效,否则就死锁了.
只有Excute()的Monitor.Enter(obj)方法先执行时才有效,否则就死锁了.
#16
遇到同样的问题,过来study一下~~
#17
还在用Thread创建线程???
#1
你要在线程处理完后执行stop()撒
#2
你直接在 public void GetData()
这个函数的最后面再call Excute()
不就行了吗?
这个函数的最后面再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()方法的内容或调用该方法
}
可以用信号量 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
这个已经试过了,不行!跟不加的效果是一样的,有时候能执行成功,有时候不行
#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);
.....}
下面是最终解决方法的代码,以供有相同问题的朋友查询
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
你好 这行代码可以保证 GetData方法可以先于Excute方法执行 也可以保证Excute方法在其结束后才开始执行 如果去掉 并无法保证GetData方法先获得锁 可能会是Excute先执行
#10
楼主的情况不需要使用Monitor啊。
如果Excute可以与GetData在同一个线程执行,则在GetData的最后调用Excute即可。
如果不行,则在GetData的最后,把Excute封送到原线程执行即可。
如果Excute可以与GetData在同一个线程执行,则在GetData的最后调用Excute即可。
如果不行,则在GetData的最后,把Excute封送到原线程执行即可。
#11
对,这也是一种解决办法,Monitor,楼上这个,和异步都是可以解决的。
#12
还有一点未说明,我的这个程序必须得使用线程.所以只能是线程
#13
异步就是多线程哦
#14
我以前没用过线程,有些知识点不清楚
#15
@softcoke_320的方法有时会失效.
只有Excute()的Monitor.Enter(obj)方法先执行时才有效,否则就死锁了.
只有Excute()的Monitor.Enter(obj)方法先执行时才有效,否则就死锁了.
#16
遇到同样的问题,过来study一下~~
#17
还在用Thread创建线程???