После реализации изменений в тупиковой C# Windows Form Application в соответствии со статьей Lock Up Unlocked я все еще с той же проблемой, как и в предыдущем коде статьи Locked Up!Почему приложение Windows Form (C#) зашло в тупик и как избежать его блокировки?
То есть, при нажатии на кнопку несколько раз быстрее, приложение зависает (становится невосприимчивым).
Почему?
И как его исправить?
using System;
using System.Windows.Forms;
using System.Threading;
namespace LockupUnlocked
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
_t = new Thread(new ParameterizedThreadStart(WorkerThread));
}
private Thread _t;
private object lockObject = new object();
private bool StopThread = false; ////changes added to avoid deadlock
private void WorkerThread(object sender)
{
Thread.Sleep(1000);
//while (true)
while (!StopThread)//changes added to avoid deadlock
{
string result = "This is a Test";
IAsyncResult aResult;////changes added to avoid deadlock
lock (lockObject)
{
Thread.Sleep(25);
//lblResult.Invoke(new MethodInvoker(delegate { lblResult.Text = result; }));
aResult = lblResult.BeginInvoke//changes to avoid deadlock
(new MethodInvoker(delegate { lblResult.Text = result; }));
}
lblResult.EndInvoke(aResult);//changes added to avoid deadlock
Thread.Sleep(500);
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
StopThread = true;
}
private void Form1_Load(object sender, EventArgs e)
{
_t.Start();
}
private void button1_Click(object sender, EventArgs e)
{
lock (lockObject)//changes added to avoid deadlock
{
lblResult.Text = "Override the Test";
}
}
}
}
Приходит ли приложение в конечном итоге снова реагировать? –
Плохой пример, если вы спросите меня. lblResult.Text чтение/запись всегда выполняется в потоке графического интерфейса, не требующем каких-либо блокировок для запуска. – Alex