-1
我使用WPF應用程序和舊代碼。有一個用於分配液體的應用程序。在檢查杯子是否被飲水機替換時,應檢查每次新的飲水量,如果沒有,則顯示需要更換杯子的消息。分配器有一個更換杯子傳感器。如果杯子被改變,我需要自動關閉MessageBox。爲此運行兩個線程。首先是另一個調查過程分配器中的MessageBox。這是代碼:在單獨的線程中顯示MessageBox並自動關閉此線程
public bool CheckChangeCupInThread()
{
if (_dispenser.Status.CupChanged == DispenserEnums.CupChanged.False)
{
var cupFormThread = new ThreadStart(CupWaitChangeForm);
var cupFormWaiter = new Thread(cupFormThread) {IsBackground = true};
cupFormWaiter.SetApartmentState(ApartmentState.STA);
var cupThread = new ThreadStart(WaitForCupChange);
var cupWaiter = new Thread(cupThread) {IsBackground = true};
cupWaiter.SetApartmentState(ApartmentState.STA);
cupFormWaiter.Start();
cupWaiter.Start();
do
{
//Wait for Cup to be changed or Cancel
} while (cupFormWaiter.IsAlive && cupWaiter.IsAlive);
var watch = new Stopwatch();
watch.Start();
if (cupFormWaiter.IsAlive)
{
cupFormWaiter.Abort();
}
if (cupWaiter.IsAlive)
{
_dispenser.SurveillanceWorker.Continue = false;
cupWaiter.Join(200);
return false;
}
watch.Stop();
}
return true;
}
private void WaitForCupChange()
{
do
{
_dispenser.GetStatus();
} while (_dispenser.Status.CupChanged == DispenserEnums.CupChanged.False);
}
private void CupWaitChangeForm()
{
MessageBox.Show("Change please the cup", "Cup сhange", MessageBoxButtons.Cancel);
}
此代碼早些時候已被用於一個擁有超過4000行代碼的大類。我做了重構,並將這些代碼放在一個單獨的類中。現在,在杯子發生變化之後,程序崩潰了,而不是在這個地方,而是在代碼更遠的地方。在Windows 10中使用應用程序時經常發生的最有趣的事情,這在Windows 7中完全沒有發生。我是多線程的新手,無法理解,我該如何解決這個問題。我使用任務和令牌來嘗試它,但直到按下按鈕,令牌才能用MessageBox關閉線程。謝謝
有一個在創造另一個線程,如果你只是將有另一個線程就是在一個循環周圍旋轉,直到它做沒有任何意義。只需在原始線程中完成工作即可。 – Servy
我想我需要兩個線程,因爲我有兩個事件 - 或者一個杯子被改變,或者MessageBox中的按鈕「取消」被點擊。我怎麼看兩個? – SergS
你不需要任何額外的線程。你應該構建你的代碼,使它是異步的,並且你會得到一個變化的通知,而不是坐在一個循環中,在你的CPU上製作一個蛋,而不是用它來生產。 – Servy