मैं काफी सकारात्मक हूं कि मैं अपने आवेदन में एक डेडलॉक बना रहा हूं और मुझे यकीन नहीं है कि इस मुद्दे को कैसे हल किया जाए। मेरे पास कुछ चलती हिस्से हैं और async
और await
पर नया हूं इसलिए कृपया मेरे साथ भालू।Async डेडलॉक?
मैं एक ग्राहक है कि एक फ़ाइल के रूप में निम्नानुसार अपलोड करता है:
public static async Task<string> UploadToService(HttpPostedFile file, string authCode, int id)
{
var memoryStream = new MemoryStream();
file.InputStream.CopyTo(memoryStream);
var requestContent = new MultipartFormDataContent();
var fileContent = new ByteArrayContent(memoryStream.ToArray());
fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(file.ContentType);
requestContent.Add(fileContent, "file", file.FileName);
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = new Uri(BaseUrl);
httpClient.DefaultRequestHeaders.Accept.Clear();
var message =
await
httpClient.PostAsync(
string.Format("Upload?authCode={0}&id={1}", authCode, id),
requestContent);
return await message.Content.ReadAsStringAsync();
}
}
टुकड़ा फ़ाइल प्राप्त:
[HttpPost]
public Task<HttpResponseMessage> Upload(string authCode, int id)
{
var request = Request;
var provider = new CustomMultipartFormDataStreamProvider(root);
var task =
request.Content.ReadAsMultipartAsync(provider)
.ContinueWith(o =>
{
// ...
// Save file
// ...
return new HttpResponseMessage()
{
Content = new StringContent("File uploaded successfully"),
StatusCode = HttpStatusCode.OK
};
});
return task;
}
यह सब के साथ शुरू हुआ है निम्नलिखित:
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
var file = HttpContext.Current.Request.Files[0];
var response = UploadToService(file, hiddenAuthCode.Value, int.Parse(hiddenId.Value));
}
}
सबकुछ काम करता प्रतीत होता है सिवाय इसके कि PostAsync
कभी भीको मान्यता नहीं देतावापस कर दिया गया है। मैं देख सकता हूं कि await ... PostAsync ...
कार्य की स्थिति प्रतीक्षा कर रही है, लेकिन मुझे पूरी तरह से यकीन नहीं है कि इसका क्या अर्थ है (याद रखें, मैं इस सामान के लिए n00b हूं)। मेरी फ़ाइल सही स्थान पर सहेजी गई है लेकिन एप्लिकेशन मेरी सेवा से प्रतिक्रिया को कभी भी पहचान नहीं लेता है।
यदि कोई मुझे सही दिशा में इंगित कर सकता है, तो इसकी सराहना की जाएगी।
इसे 'रजिस्टरएसिंक टास्क' में बदलने के बाद, मुझे 'तर्क प्रकार प्रणाली' मिलती है। थ्रेडिंग। टास्क। पैरामीटर प्रकार System.Web.UI.PageAsyncTask' को असाइन करने योग्य नहीं है। मैंने अपने रिटर्न प्रकार को बदलने की कोशिश की लेकिन इससे कुछ अन्य त्रुटियां हुईं। कोई विचार? –
Joe
@ जो, एक और ट्विक: 'नया पेजएसिंक टास्क (() => अपलोड करने की सेवा (फ़ाइल, ...))', तर्क एक 'Func' है। –
Noseratio
धन्यवाद! परिवर्तन करने के बाद, कोई और डेडलॉक नहीं। – Joe