我在 UI 線程上顯示 ProgressBar,然后在另一個線程上啟動登錄過程。這完美地工作,我得到了 ProgressBar “圓圈”,它讓用戶知道正在發(fā)生的事情。問題是我需要通過 UI 向用戶返回任何登錄錯誤,例如無效的用戶名/密碼。我更改了我的 ProgressBar 類以包含一個ErrorMessage屬性,將其實例化并將其作為參數(shù)傳遞給登錄過程。如果出現(xiàn)任何錯誤,我都會設置該ErrorMessage屬性。如果它不為空,我將顯示錯誤。if問題是登錄線程在我到達檢查 null之前沒有完成。這都是在按鈕單擊事件上完成的。我的代碼:MyButton_Submit.Click += async (sender, e) =>{ ManualResetEvent resetEvent = new ManualResetEvent(false); ProgressBarHandler myprogressbar = new ProgressBarHandler(this); myprogressbar.show(); var thread = new System.Threading.Thread(new ThreadStart(async delegate { await SignOn(myprogressbar); resetEvent.Set(); })); thread.Start(); // based on @Giorgi Chkhikvadze comment below I changed: resetEvent.WaitOne(); to: await Task.Run(() => resetEvent.WaitOne()); // works perfectly while (thread.ThreadState == ThreadState.Running) { await Task.Delay(100); } myprogressbar.hide(); if (myprogressbar.ErrorMesage != null) { Context context = Application.Context; string text = myprogressbar.ErrorMesage ; ToastLength duration = ToastLength.Short; var toast = Toast.MakeText(context, text, duration); toast.Show(); } };}該行resetEvent.WaitOne();顯然阻塞了用戶界面,因為當我將其注釋掉時,會顯示進度條,而當我執(zhí)行它時,它不會。我怎樣才能解決這個問題?
2 回答

搖曳的薔薇
TA貢獻1793條經(jīng)驗 獲得超6個贊
您不需要單獨的線程;await會自己工作得很好。您也不需要ManualResetEvent將工作完成作為“信號”;使用awaiton aTask效果很好。
等效的簡化代碼:
MyButton_Submit.Click += async (sender, e) =>
{
ProgressBarHandler myprogressbar = new ProgressBarHandler(this);
myprogressbar.show();
await SignOn(myprogressbar);
myprogressbar.hide();
if (myprogressbar.ErrorMesage != null)
{
...
}
};
你永遠不Thread應該在 Xamarin 應用程序中輸入類型??傆懈唵?、更好的方法。該Thread類型一般是“強黃色”標志,但在 Xamarin 中是紅色標志。

森林海
TA貢獻2011條經(jīng)驗 獲得超2個贊
awaitTask.Run(() => resetEvent.WaitOne());
應該可以解決問題。ManualResetEvent
不可等待,不能直接在其上使用 await 關鍵字,因此您需要將其包裝在任務中
- 2 回答
- 0 關注
- 301 瀏覽
添加回答
舉報
0/150
提交
取消