using System; using System.Threading;namespace ConsoleApplication1 { class Program { static AutoResetEvent e; static void Main(string[] args) { e = new AutoResetEvent(false); Thread t1 = new Thread(Work1); Thread t2 = new Thread(Work2); t1.Start(); t2.Start(); } static void Work1() { Console.WriteLine("1"); e.Set(); } static void Work2() { e.WaitOne(); Console.WriteLine("2"); } } }
可以使用task啊 Task t = new Task(() => { for (int i = 0; i < 10; i++) { ss += "1111\r\n"; } Console.WriteLine(ss); }); t.Start(); Task t2 = t.ContinueWith(task => { for (int i = 0; i < 10; i++) { ss += "2222\r\n";
你可以用Lock、Monitor来解决这个问题
using System.Threading;namespace ConsoleApplication1
{
class Program
{
static AutoResetEvent e;
static void Main(string[] args)
{
e = new AutoResetEvent(false);
Thread t1 = new Thread(Work1);
Thread t2 = new Thread(Work2);
t1.Start();
t2.Start();
} static void Work1()
{
Console.WriteLine("1");
e.Set();
} static void Work2()
{
e.WaitOne();
Console.WriteLine("2");
}
}
}
for (int i = 0; i < 10; i++)
{ ss += "1111\r\n";
}
Console.WriteLine(ss);
});
t.Start();
Task t2 = t.ContinueWith(task => {
for (int i = 0; i < 10; i++)
{ ss += "2222\r\n";
}
Console.WriteLine(ss);
});
还有,为什么我在ttt1里边加ttt2方法不会假死?ttt2不是没有放在子线程不是吗?应该会假死呀. 还是说因为ttt1是子线程,在子线程里边调用方法是不会影响到主线程的吗?
那你就直接将t1的函数放主线程里就好了嘛,开多线程还有什么意义啊.
让主线程去等待子线程,这没有道理.
不过也不是不能实现.
你在主线程里写while(tt1.IsAlive){sleep(1000);}
t1.Start();
// t1.Join();
//t2 = new Thread(ttt2);
//t2.Start();
MessageBox.Show("1");//这句话要在方法结束之后显示,要把Join()放在哪里呢?
你将主线程停了,不就直接死了么,还用假死?
MessageBox.Show("1");当然是放主线程里了,子线程不可能直接蹦出这个来.
你可以在timer里判断线程是否执行完了,执行完就弹出个对话框.
当然你还需要一个bool型的变量来控制一下,让它只弹出一次,否则timer每执行一次就弹出一个
MessageBox.Show("1");当然是放主线程里了,子线程不可能直接蹦出这个来.
你可以在timer里判断线程是否执行完了,执行完就弹出个对话框.
当然你还需要一个bool型的变量来控制一下,让它只弹出一次,否则timer每执行一次就弹出一个子线程里怎么会不能跳出弹出框呢???? 晕,不过这个问题我解决了,我是另外开了一个线程,不在Button点击事件里边操作了,我非常奇怪为什么这样就可以,也不想继续问下去了,估计你们要烦我了.....结贴/.
MessageBox.Show("1");当然是放主线程里了,子线程不可能直接蹦出这个来.
你可以在timer里判断线程是否执行完了,执行完就弹出个对话框.
当然你还需要一个bool型的变量来控制一下,让它只弹出一次,否则timer每执行一次就弹出一个每次我提的线程问题你都很积极啊,分多给你点~