【发布时间】:2017-10-17 07:18:20
【问题描述】:
这是我描述问题的代码:
public partial class Form1 : Form
{
private readonly object lockObject = new object();
public Form1()
{
InitializeComponent();
}
private void btnWorkerThread_Click(object sender, EventArgs e)
{
Task.Factory.StartNew(() => SomeLongRunningThread());
}
private void SomeLongRunningThread()
{
lock (lockObject)
{
Thread.Sleep(3000);
if (txtResult.InvokeRequired)
{
Thread.Sleep(3000);
txtResult.Invoke((MethodInvoker) delegate { txtResult.Text = DateTime.Now.ToShortTimeString(); });
}
else
{
Thread.Sleep(3000);
txtResult.Text = DateTime.Now.ToShortTimeString();
}
}
}
private void btnUIThread_Click(object sender, EventArgs e)
{
SomeLongRunningThread();
}
}
当工作线程启动然后btnUIThread被点击时发生死锁:
txtResult.InvokeRequried 上好像发生了死锁:
- 工作线程将控制权传递给 ui 线程
- 由于 ui 线程轮到,它同时更新 txtResult 并尝试启动 btnUIThread 点击。
- 在线
txtResult.Invoke((MethodInvoker) delegate { txtResult.Text = DateTime.Now.ToShortTimeString(); });发生死锁
如果我错了,请纠正我。
问题是如何处理死锁?
编辑:经过各位大侠的宝贵解答,我的实际项目比预期的要复杂,锁块有更多的代码,我应该保证一次一个线程执行。
【问题讨论】:
-
这是一个经过验证的示例,那么仅使用该代码会发生这种情况吗?
-
是的,它是@RandRandom
-
独立逻辑,在UI线程上从UI控件中读取需要的数据,传递给工作线程,工作完成后返回返回计算数据,用返回的数据更新UI控件
-
这是复制粘贴错误吗?
txtResult.Text = txtResult.Text = DateTime.Now.ToShortTimeString(); -
@RandRandom 已更正。谢谢
标签: c# multithreading winforms