2012-07-29 55 views
0

我將使用REST API的Android應用程序移植到WP7平臺。HttpWebRequest.BeginGetResponse是否在WP7或Silverlight的線程池中使用阻塞GetResponse?

在Android中,所有REST API調用都被阻塞,我手動使用執行程序來平衡執行網絡I/O的線程。

在WP7和Silverlight中,我必須使用HttpWebRequest.BeginGetResponse,它只有讀取響應的異步變體。

它是:

1)使用類似於I/O異步完成,這真的異步? 或 2)只在內部的+線程內使用阻塞讀/寫操作?

+0

出於好奇,你爲什麼要問?有關係嗎? – 2012-07-29 19:47:45

+0

正如我之前所說:我移植現有Android的應用程序代碼,使用阻塞閱讀+線程池進行網絡請求平衡,我認爲將Java的ThreadPoolExecutor移植到WP7,並使用我的Java代碼進行最少的更改,但如果WP7的異步I/O方法是不是真正的異步(使用隱藏的阻塞閱讀+線程) - >移植WP7應用程序可能會有一個性能問題,我想避免(將2個線程同時運行,而不是1對於一個掛起的REST方法)。對於電話應用來說,大量的線程是不好的做法,即使他們閒置。 – gorecode 2012-07-31 08:32:55

+0

確實有道理。感謝您的解釋。 – 2012-07-31 10:33:54

回答

0

我剛剛使用Reflector檢查了源代碼,它是在線程池上執行的阻塞調用。

public override IAsyncResult BeginGetResponse(AsyncCallback callback, object state) 
{ 
    this.startGetResponse(); 
    LazyAsyncResult result = new LazyAsyncResult(this, state, callback); 
    if (!ThreadPool.QueueUserWorkItem(new WaitCallback(this.asyncGetResponse), result, true)) 
    { 
     throw new OutOfMemoryException(SR.GetString(0x49, new object[0])); 
    } 
    return result; 
} 
+0

你能告訴我你是如何得到這個反編譯源代碼的?當我反編譯Silverlight程序集時,我只能看到方法中的存根(如throw NotImplementedException()); – gorecode 2012-07-30 12:27:30

+0

@gorecode:http://stackoverflow.com/questions/3239320/reflector-not-decompiling-system-data-entity-dll-net-4-0/3399222#3399222 – Will 2012-07-30 12:53:23

+0

對於「那些集合只包含元數據「部分。不幸的是,完整的程序集不能直接與SDK一起使用(它直接存儲在模擬器映像中)。可以使用傾卸工具從圖像中提取組件。您可以在Xda-Developers論壇中找到更多信息。 – 2012-07-30 17:36:30