解決C 中乙個 非同步方法卻同步執行 的問題

2022-02-06 20:54:37 字數 1386 閱讀 3614

幾個月前做的乙個軟體裡想新增乙個天氣預報功能, 也就是利用了一下google weather的介面: 某某市,某某省 , 效果也達到了.

}就是這樣的乙個所謂非同步的方法, 執行一下, 最短的時候花了3秒多才獲取到了weatherstring, 很多時候甚至花了10秒多. 我就眼巴巴的看著程式在假死(not responding), 一邊看著我的**, 我不是非同步了麼? 非同步不是就是為了避免程式假死的麼? 目前來看程式似乎並沒有非同步.

於是開始找原因...也請教了不少人...也得到了一些可能的原因:

事實上我ping了google.com之後, 把google.com換成ip位址, 執行程式, 並沒有發現有什麼效果...

但把getresponsestream改成begingetresponsestream之後, 也沒有任何改觀.

想一想這些應該都是在快取記憶體上進行的, 不至於要花3秒, 10多秒吧?

這個問題還真不太好描述, 事實上後來做了一系列的測試, 測試發現只有第一次發出webrequest看似不是非同步的. 接下來繼續嘗試幾次發出webrequest, 到獲得response的時間就非常非常短. 為了找出究竟在哪個環節耗時比較厲害, 我寫了乙個控制台程式來測試, 測試中我用了乙個for迴圈, 連續發出5次同樣的webrequest, 測試結果如下:

可以發現程式在第一次初始化webrequest和第一次從發出請求到獲得響應消耗的時間最多! 昨天發現原來是**(proxy)的問題! msdn中關於httpwebrequest.proxy屬性是這樣描述的:

本地計算機或應用程式配置檔案可能指定使用預設**。 如果指定了 proxy 屬性,則 proxy 屬性中的**設定會重寫本地計算機或應用程式配置檔案,並且 httpwebrequest 例項將實用指定的**設定。 如果配置檔案中未指定**並且未指定 proxy 屬性,則 httpwebrequest 類使用從本地計算機上的 internet explorer 中繼承的**設定。 如果 internet explorer 中沒有**設定,請求會直接傳送到伺服器。

回到遇到的問題, 程式並沒有指定**, 第一次執行的時候, 程式會尋找ie中的**, 如果沒有找到才會去直接訪問伺服器, 這中間花費了不少時間. 要解決這個問題, 請在**中加上這麼一行:

xxrequest.proxy = null;

C中乙個有趣的列印

在lresult sendmessage hwnd hwnd,handle of destination window uint msg,message to send wparam wparam,first message parameter lparam lparam second messag...

執行緒同步與非同步乙個視窗賣票例項

文章裡借鑑了 這篇文章裡的內容 1 執行緒繼承thred類,並重寫,然後出現非同步的情況。public class threadtest extends thread 為了保持數量的一直,票數設定為靜態 static int tick 20 重寫run方法,實現買票操作 override publi...

Winform 非同步呼叫乙個方法

在進行winform開發時,我們都知道經常會用到非同步掉乙個方法。我們除了可以新啟動乙個執行緒外,還可以通過delegate.begininvoke 或invoke 來實現方法的非同步呼叫。但以上兩種非同步方式呼叫方法,如果方法中有關於介面的操作,比如改變介面某乙個控制項的屬性值,這時候就會報錯 執...