第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C# 需要等待線程完成而不阻塞 UI 線程

C# 需要等待線程完成而不阻塞 UI 線程

C#
繁花不似錦 2022-12-31 13:52:54
我在 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 中是紅色標志。


查看完整回答
反對 回復 2022-12-31
?
森林海

TA貢獻2011條經(jīng)驗 獲得超2個贊

awaitTask.Run(() => resetEvent.WaitOne());應該可以解決問題。ManualResetEvent不可等待,不能直接在其上使用 await 關鍵字,因此您需要將其包裝在任務中



查看完整回答
反對 回復 2022-12-31
  • 2 回答
  • 0 關注
  • 301 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號