2014-07-22 18 views
8

मैं काफी सकारात्मक हूं कि मैं अपने आवेदन में एक डेडलॉक बना रहा हूं और मुझे यकीन नहीं है कि इस मुद्दे को कैसे हल किया जाए। मेरे पास कुछ चलती हिस्से हैं और 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 हूं)। मेरी फ़ाइल सही स्थान पर सहेजी गई है लेकिन एप्लिकेशन मेरी सेवा से प्रतिक्रिया को कभी भी पहचान नहीं लेता है।

यदि कोई मुझे सही दिशा में इंगित कर सकता है, तो इसकी सराहना की जाएगी।

उत्तर

6

मुझे लगता है कि समस्या यह है कि आप के अंदर आग और भूलने की विधि में बस UploadToService पर कॉल करें। इस कार्य को पूरा करने से पहले अनुरोध प्रसंस्करण बस समाप्त होता है।

आपको इस वेबफॉर्म पेज में <%@ Page Async="true" ...> का उपयोग करना चाहिए और 10 में <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> शामिल करना चाहिए।

फिर RegisterAsyncTask उपयोग करते हैं, कोड इस तरह दिखेगा:

file.InputStream.CopyTo(memoryStream); 

इस तरह::

await file.InputStream.CopyToAsync(memoryStream); 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack) 
    { 
     var file = HttpContext.Current.Request.Files[0]; 

     RegisterAsyncTask(new PageAsyncTask(() => UploadToService(file, 
      hiddenAuthCode.Value, int.Parse(hiddenId.Value)))); 
    } 
} 

एक तरफ ध्यान दें पर, आप इस भाग को बेहतर बना सकते और ContinueWith को async/await के साथ प्रतिस्थापित करें:

[HttpPost] 
public async Task<HttpResponseMessage> Upload(string authCode, int id) 
{ 
    var request = Request; 

    var provider = new CustomMultipartFormDataStreamProvider(root); 

    await request.Content.ReadAsMultipartAsync(provider); 

    return new HttpResponseMessage() 
    { 
     Content = new StringContent("File uploaded successfully"), 
     StatusCode = HttpStatusCode.OK 
    }; 
} 

संबंधित: "Using Asynchronous Methods in ASP.NET 4.5"

+0

इसे 'रजिस्टरएसिंक टास्क' में बदलने के बाद, मुझे 'तर्क प्रकार प्रणाली' मिलती है। थ्रेडिंग। टास्क। पैरामीटर प्रकार System.Web.UI.PageAsyncTask' को असाइन करने योग्य नहीं है। मैंने अपने रिटर्न प्रकार को बदलने की कोशिश की लेकिन इससे कुछ अन्य त्रुटियां हुईं। कोई विचार? – Joe

+0

@ जो, एक और ट्विक: 'नया पेजएसिंक टास्क (() => अपलोड करने की सेवा (फ़ाइल, ...))', तर्क एक 'Func ' है। – Noseratio

+1

धन्यवाद! परिवर्तन करने के बाद, कोई और डेडलॉक नहीं। – Joe

संबंधित मुद्दे