C#多线程问题,子线程结束后回到主线程。

我在Button_click事件中,执行一个线程,我希望线程结束后,继续执行Button_click函数后面的程序,但是使用thread.join()不起效果。我希望线程... 我在Button_click事件中,执行一个线程,我希望线程结束后,继续执行Button_click函数后面的程序,但是使用thread.join()不起效果。 我希望线程结束后,执行MadeRecord()。
private void button_Click(object sender, RoutedEventArgs e)
{
serialPort.Open();
thread = new Thread(SendAndReceive);
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
thread.Join();

MadeRecord();
}
展开
 我来答
百度网友8d17b9d
2014-05-08 · TA获得超过280个赞
知道小有建树答主
回答量:161
采纳率:100%
帮助的人:181万
展开全部

首先,我觉得你的方法应该是可以实现你想要的功能的,为此我改写了你的两个处理方法来做测试, 如下:

private void SendAndReceive()
{
    Console.WriteLine("Started sending and recieving...");
    Thread.Sleep(2000);
    Console.WriteLine("Finished sending and recieving...");
}
private void MakeRecord()
{
    Console.WriteLine("Recording...");
}

如果你Debug执行这个程序,可以在输出窗口看到如下输出:

Started sending and recieving...
The thread '<No Name>' (0x1fc4) has exited with code 0 (0x0).
Finished sending and recieving...
Recording...

不知道你的方法里有什么特殊的逻辑。

 

我建议你使用微软提供的专门处理这类情况的对象BackgroundWorker

http://msdn.microsoft.com/en-us/library/vstudio/system.componentmodel.backgroundworker

可以让你更灵活来完成你想要的功能。

当然,还有其他的方法。 具体可以看看多线程相关的对象。

 

下面给你使用BackgroundWorker来完成这个功能的代码,

BackgroundWorker backWorker = new BackgroundWorker();
public DemoForm()
{
    InitializeComponent();
    backWorker.DoWork += backWorker_DoWork;
    backWorker.RunWorkerCompleted += backWorker_RunWorkerCompleted;
}
void backWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    MakeRecord();
}
void backWorker_DoWork(object sender, DoWorkEventArgs e)
{
    SendAndReceive();
}
private void button_Click(object sender, EventArgs e)
{
    backWorker.RunWorkerAsync();
}

同样可以得到上面的结果:

Started sending and recieving...
Finished sending and recieving...
Recording...
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式