संपादित करें: यह प्रश्न दिखता है कि यह एक ही समस्या हो सकती है, लेकिन इसकी कोई प्रतिक्रिया नहीं है ...
संपादित करें: परीक्षण के मामले में 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(...)?