संपादित करें: यह प्रश्न दिखता है कि यह एक ही समस्या हो सकती है, लेकिन इसकी कोई प्रतिक्रिया नहीं है ...
संपादित करें: परीक्षण के मामले में 5 कार्य WaitingForActivation
राज्य में अटके हुए प्रतीत होते हैं ।
मैंने .NET 4.5 में System.Net.Http.HttpClient का उपयोग करते हुए कुछ विषम व्यवहार का सामना किया है - जहां (जैसे) कॉल के परिणाम की "प्रतीक्षा" httpClient.GetAsync(...)
कभी वापस नहीं आएगी।
यह केवल कुछ विशेष परिस्थितियों में होता है जब नए एसिंक्स / वेट लैंग्वेज फंक्शनलिटी और टास्क एपीआई का उपयोग किया जाता है - इन निरंतरता का उपयोग करते समय कोड हमेशा काम करता है।
यहाँ कुछ कोड है जो समस्या को पुन: पेश करता है - इसे निम्नलिखित GET समापन बिंदुओं को उजागर करने के लिए Visual Studio 11 में एक नए "MVC 4 WebApi प्रोजेक्ट" में छोड़ दें:
/api/test1
/api/test2
/api/test3
/api/test4
/api/test5 <--- never completes
/api/test6
यहां प्रत्येक समापन बिंदु एक ही डेटा (स्टैकओवरफ़्लो डॉट कॉम से प्रतिक्रिया हेडर) लौटाता है, /api/test5
जिसके अलावा कभी पूरा नहीं होता है।
क्या मुझे HttpClient वर्ग में बग का सामना करना पड़ा है, या क्या मैं किसी तरह एपीआई का दुरुपयोग कर रहा हूं?
पुन: पेश करने के लिए कोड:
public class BaseApiController : ApiController
{
/// <summary>
/// Retrieves data using continuations
/// </summary>
protected Task<string> Continuations_GetSomeDataAsync()
{
var httpClient = new HttpClient();
var t = httpClient.GetAsync("http://stackoverflow.com", HttpCompletionOption.ResponseHeadersRead);
return t.ContinueWith(t1 => t1.Result.Content.Headers.ToString());
}
/// <summary>
/// Retrieves data using async/await
/// </summary>
protected async Task<string> AsyncAwait_GetSomeDataAsync()
{
var httpClient = new HttpClient();
var result = await httpClient.GetAsync("http://stackoverflow.com", HttpCompletionOption.ResponseHeadersRead);
return result.Content.Headers.ToString();
}
}
public class Test1Controller : BaseApiController
{
/// <summary>
/// Handles task using Async/Await
/// </summary>
public async Task<string> Get()
{
var data = await Continuations_GetSomeDataAsync();
return data;
}
}
public class Test2Controller : BaseApiController
{
/// <summary>
/// Handles task by blocking the thread until the task completes
/// </summary>
public string Get()
{
var task = Continuations_GetSomeDataAsync();
var data = task.GetAwaiter().GetResult();
return data;
}
}
public class Test3Controller : BaseApiController
{
/// <summary>
/// Passes the task back to the controller host
/// </summary>
public Task<string> Get()
{
return Continuations_GetSomeDataAsync();
}
}
public class Test4Controller : BaseApiController
{
/// <summary>
/// Handles task using Async/Await
/// </summary>
public async Task<string> Get()
{
var data = await AsyncAwait_GetSomeDataAsync();
return data;
}
}
public class Test5Controller : BaseApiController
{
/// <summary>
/// Handles task by blocking the thread until the task completes
/// </summary>
public string Get()
{
var task = AsyncAwait_GetSomeDataAsync();
var data = task.GetAwaiter().GetResult();
return data;
}
}
public class Test6Controller : BaseApiController
{
/// <summary>
/// Passes the task back to the controller host
/// </summary>
public Task<string> Get()
{
return AsyncAwait_GetSomeDataAsync();
}
}
HttpClient.GetAsync(...)
?