[英]async function - first start first end - C# WPF
我有一個問題,我有一個文本框控件,我激活了keyup功能,因此,當用戶在系統中寫入ID時,程序將開始搜索,直到找到用戶為止。
我在下面的示例代碼中使用它
private async void PNationalNo_KeyUp(object sender, KeyEventArgs e)
{
string Ptext = Textbox.text;
string ResposeDataP = "";
await Task.Run(() =>
{
ResposeDataP = RunAsyncGetOnePatient(Ptext, GV.AccountID).Result;
});
Patient1 = JsonConvert.DeserializeObject<PatientM>(ResposeDataP);
if (Patient1 != null)
{
WrongMsg1.Text = "user '" + Patient1 .PatientFullName.ToLower() + "' have this ID number!";
}
else
{
WrongMsg1.Text = "there is no user have this ID!!";
}
}
這段代碼的問題,有時當代碼在最后一個異步槽中找到結果時,其中一個任務比結局需要更多的時間,因此程序會打印該后一個函數的結果! 不是最后一個嗎?! ((沒有用戶有這個ID !!)),因為它不是異步代碼中的最后一個函數,所以我該如何解決這個問題?
從評論更新
我的意思是,如果數據庫中的用戶ID = "123"
,當我按1時,這是第一個功能。
然后,當我按2時, textbox = "12"
當我按3 textbox = "123"
因此它應該在找到用戶的WrongMsg1.Text
中打印,但是問題有時是textbox = "12"
的功能在"123"
函數之后完成,因此它在"there is no user have this id!!"
打印"there is no user have this id!!"
。
你了解我嗎? 因為async
功能編號2在最后一個功能之后完成。
這似乎是典型的比賽條件。 由於Task.Run在后台線程中執行,因此您不再可以控制執行順序,這意味着第二個字符的輸入將在第三個字符之后進行求值。 因此,您必須找到一種方法來確保重新控制時執行順序仍然正確。
可能的解決方案可能是在異步任務完成后檢查文本框中的文本是否仍然相同:
private async void PNationalNo_KeyUp(object sender, KeyEventArgs e)
{
string Ptext = Textbox.text;
string ResposeDataP = "";
await Task.Run(() =>
{
ResposeDataP = RunAsyncGetOnePatient(Ptext, GV.AccountID).Result;
});
if (Textbox.text != Ptext)
{
return;
}
Patient1 = JsonConvert.DeserializeObject<PatientM>(ResposeDataP);
if (Patient1 != null)
{
WrongMsg1.Text = "user '" + Patient1 .PatientFullName.ToLower() + "' have this ID number!";
}
else
{
WrongMsg1.Text = "there is no user have this ID!!";
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.