該程式詢問一個人是否要檢查位元幣的最后收盤價,每當他按下按鈕時,它應該首先說“正在加載...”,然后等到收到價格并將其分配給標簽的 .Text 屬性. 當我在控制臺應用程式中運行代碼時,應用程式在實際接收到所需資訊之前關閉(只寫入 "Loading..." )但如果我添加 ReadKey() 價格資訊顯示。我想類似的事情發生在 windows 表單應用程式中,它試圖為 value 的文本屬性分配一個缺失的值,因此程式在顯示“正在加載...”后崩潰。
public static async Task<string> ApiCall(string apikey)
{
RestClient client = new RestClient("https://api.polygon.io/v2/aggs/ticker/X:BTCUSD/prev?adjusted=true&apiKey=");//write your api key
RestRequest request = new RestRequest($"?api-key={apikey}", Method.GET);
IRestResponse response = await client.ExecuteAsync(request);
return response.Content;
}
public static async Task<string> apiReceiver(string last_closed)
{
Task<string> apiCallTask = getAPI.ApiCall("[apikey]");
string result = apiCallTask.Result;
dynamic array = JsonConvert.DeserializeObject(result);
last_closed = array.results[0].c;
return last_closed;
}
public static async Task dataWait(Label lab, string last_closed)
{
lab.Text = "Loading info ...";
lab.Text = await apiReceiver(last_closed);
}
private async void button1_Click(object sender, EventArgs e)
{
string last_closed = "";
await getAPI.dataWait(label1, last_closed);
}
uj5u.com熱心網友回復:
你為什么不等getAPI.ApiCall("[apikey]");?.Result在任務完成之前使用,會導致死鎖。winforms 在該執行緒上設定了 SynchronizationContext。這意味著在等待之后,您將回傳 UI 執行緒并被允許并因此能夠修改 UI 控制元件。
當你.Result在一個任務上使用時,如果它沒有完成,它會在那里等待(阻塞執行緒)。問題是當任務準備好時,它會被發布到UI執行緒上,但永遠不會被執行,因為執行緒仍然被阻塞。
winforms 和控制臺的區別。控制臺沒有設定 SynchronizationContext,所以方法的其余部分(在等待之后)被發布到執行緒池上。您可以呼叫Console.Writeline任何執行緒。
所以await在這里使用,所以執行緒不會被阻塞。
public static async Task<string> apiReceiver(string last_closed)
{
string result = await getAPI.ApiCall("[apikey]");
dynamic array = JsonConvert.DeserializeObject(result);
last_closed = array.results[0].c;
return last_closed;
}
以下是一些資訊:
來源
但是,如果該代碼在 UI 應用程式中運行,例如當一個按鈕被點擊時,如下例所示: 然后應用程式將凍結并停止作業,我們就會陷入死鎖。當然,我們圖書館的用戶會抱怨,因為它使應用程式無回應。
有關 SynchronizationContext 的更多資訊,請閱讀codeproject.com Understanding-the-SynchronizationContext
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/379811.html
上一篇:如何切換回異步/等待?
