सारांश: क्या यह भी संभव है?मैं HttpWebRequest को यथासंभव समकालिक रूप से व्यवहार करने के लिए कैसे प्राप्त कर सकता हूं?
unit test function on ui thread:
- creates a background thread
- starts the thread
- waits for it to complete (function does not exit until it completes!)
background thread:
- opens an http stream
- reads a url from the web
- terminates
मेरे संदेह: ढांचा एसिंक्रोनस रूप से कुछ आंतरिक संदेश कतार पर परिणाम डालता है और इस प्रकार की प्रतिक्रिया कॉलबैक तक ui धागा के ढेर unwinds और ढेर पंप करने के लिए कुछ ui धागा समारोह को जाता है कभी नहीं बुलाया जाएगा।
पूरी कहानी:
मैं एक ऐप्लिकेशन है जो विभिन्न स्रोतों से एक धारा, उनमें से एक एक सरल http url से किया जा रहा है बनाने की आवश्यकता है पोर्टिंग कर रहा हूँ। मैं इसे पृष्ठभूमि धागे पर कर रहा हूं, और आदर्श रूप में मैं इसे 100% सिंक्रनाइज़ तरीके से व्यवहार करना चाहता हूं, केवल आवश्यकता होने पर ब्लॉक करें (यह ठीक है क्योंकि यह पृष्ठभूमि थ्रेड पर है)।
लेकिन ऐसा लगता है कि ढांचा थोड़ा मिकी माउस है, यह मानता है कि आप यूई धागे पर अनुरोध कर रहे हैं और इसलिए यह कोडर को एसिंच ऑपरेशन करने के लिए पृष्ठभूमि थ्रेड बनाने से ढाल देगा। लेकिन मुझे कुछ याद आ रहा है।
मैं निम्न आलेख भर में ठोकर खाई है http://pieterderycke.wordpress.com/2011/05/23/adding-synchronous-methods-to-webrequest-on-windows-phone-7/, जो http वेब अनुरोध तुल्यकालिक बनाने के लिए एक समाधान पता चलता है। लेकिन जैसा कि इसे कार्यान्वित किया गया है, मुझे प्रोटोकॉलविलेशन अपवाद मिलता है। मैंने बाद में BeginGetRequestStream() के बजाय BeginGetResponse() का उपयोग करने के लिए कोड में संशोधन किया है, और ऐसा लगता है कि यह अब अपवाद का कारण नहीं है।
लेकिन ऐसा लगता है कि पृष्ठभूमि धागा अब अनिश्चित काल तक अवरुद्ध है। मेरे यूई थ्रेड I लूप पर, थ्रेड कर रहा है। नींद (10) क्योंकि मैं एक यूनिट टेस्ट फ़ंक्शन में हूं, मेरे कॉलबैक को कॉल करने का इंतजार कर रहा हूं। क्या यह संभव है कि कॉलबैक यूनिट टेस्ट फ़ंक्शन रिटर्न तक नहीं बुलाया जाएगा और यूई थ्रेड को संदेशों को पंप करने का मौका है? यदि हां, तो मैं इसे पंप करने के लिए मजबूर कर सकता हूं ताकि मैं यूनिट टेस्ट रूटीन में छोड़ा गया जहां मैं जारी रख सकूं?
ऊपर वर्णित आलेख के निचले हिस्से में, एक टिप्पणी की जाती है "यदि आप अपने कोड का परीक्षण करते हैं, तो आप पाएंगे कि अगर आप यूआई थ्रेड पर इसे निष्पादित करते हैं तो यह डेडलॉक्स होगा।" लेकिन मैं इसे पृष्ठभूमि धागे पर निष्पादित कर रहा हूं, तो ठीक है?
एमएसडीएन दस्तावेज़ केवल आपको एसिंच कॉल करने के तरीके दिखाते हैं। और वे यह भी उल्लेख करते हैं कि "BeginGetResponse विधि को कुछ सिंक्रोनस सेटअप कार्यों को पूरा करने की आवश्यकता होती है" ... "आमतौर पर कई सेकंड" ... लेकिन "60 सेकंड या अधिक समय लग सकता है"। यह ui धागे पर निष्पादित करने के लिए बहुत बुरा लगता है। http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetresponse.aspx
कृपया मदद करें!
यहाँ मेरी कोड है:
using System.Net;
using System.Threading;
using System;
using System.IO;
namespace Blah
{
// http://pieterderycke.wordpress.com/2011/05/23/adding-synchronous-methods-to-webrequest-on-windows-phone-7/
// Creates synchronous web requests.
// Must not be called on UI threads.
public static class WebRequestExtensions
{
public static Stream GetRequestStream(this WebRequest request)
{
AutoResetEvent autoResetEvent = new AutoResetEvent(false);
IAsyncResult asyncResult = null;
{
// http://stackoverflow.com/questions/253549/how-do-i-use-httpwebrequest-with-get-method
if (request.Method == "GET")
{
asyncResult = request.BeginGetResponse(
r => autoResetEvent.Set(), null);
}
else
{
asyncResult = request.BeginGetRequestStream(
r => autoResetEvent.Set(), null);
}
}
// Wait until the call is finished
autoResetEvent.WaitOne();
return request.EndGetRequestStream(asyncResult);
}
}
}
मैं भी हाल ही में http://www.eggheadcafe.com/tutorials/aspnet/91f69224-3da5-4959-9901-c5c717c9b184/making-silverlight-emulate-synchronous-requests.aspx भर में ठोकर खाई है, लेकिन इस एक ही समस्या दर्शाती है। ऐसा लगता है कि जब तक यूई थ्रेड स्टैक को वापस नहीं लौटाता तब तक मुझे अपना कॉलबैक नहीं मिलता है ... मैं कहीं किसी फ्रेमवर्क संदेश कतार की गंध कर सकता हूं, क्या मैं सही हूँ?
धन्यवाद
कोड मुझे ठीक लग रहा है। मुझे लगता है कि ProtocolViolationException आपको कुछ बता रहा है! आप किस यूआरएल का उपयोग कर रहे हैं? पूरा अपवाद संदेश क्या था? – ColinE
धन्यवाद, लेकिन जैसा कि मैंने कहा था कि प्रोटोकॉल विलोएशन अपवाद दूर हो गया है क्योंकि मैंने अनुरोध को बदल दिया है। अनुरोध के साथ BginginGetRequestStream()। BginginGetResponse()। – swinefeaster