2014-09-10 49 views
0

我有一些有時可以運行的異步代碼,有時不會。有了這個代碼,文件總是創建,但有時它是空的(我總是發送具有內容的文件):我應該取消異步隨機工作代碼嗎?

[HttpPost] 
[Route("api/inventory/sendxml/{userId}/{pwd}/{filename}")] 
public async void SendInventoryXML(String userId, String pwd, String fileName) 
{ 
    Task task = Request.Content.ReadAsStreamAsync().ContinueWith(t => 
    { 
     var stream = t.Result; 
     using (FileStream fileStream = File.Create(String.Format(@"C:\HDP\{0}.xml", fileName), (int)stream.Length)) 
     { 
      byte[] bytesInStream = new byte[stream.Length]; 
      stream.Read(bytesInStream, 0, (int)bytesInStream.Length); 
      fileStream.Write(bytesInStream, 0, bytesInStream.Length); 
     } 
    }); 
} 

所以,我應該取消Asyncify這個隨機工作代碼,如果是這樣,怎麼樣(什麼會完成同樣的事情沒有異樣的變幻莫測(假設這是造成這種隨機行爲的問題))?

回答

5

您是否嘗試過使用await關鍵字?我的猜測是,當SendInventoryXML方法完成Request對象的釋放。在您調用ReadStreamAsync()方法後(不等待它完成),它會立即完成。 await關鍵字將強制它等待結果。

[HttpPost] 
[Route("api/inventory/sendxml/{userId}/{pwd}/{filename}")] 
public async void SendInventoryXML(String userId, String pwd, String fileName) 
{ 
    var stream = await Request.Content.ReadAsStreamAsync(); 
    using (FileStream fileStream = File.Create(String.Format(@"C:\HDP\{0}.xml", fileName), (int)stream.Length)) 
    { 
     byte[] bytesInStream = new byte[stream.Length]; 
     stream.Read(bytesInStream, 0, (int)bytesInStream.Length); 
     fileStream.Write(bytesInStream, 0, bytesInStream.Length); 
    } 
} 
3

你的隨機工作代碼是隨機的,因爲你返回一個void,並且當異步框架完成時沒有辦法讓回調得到回調。對於返回voidasync方法,請將其更改爲返回Task

另外,你爲什麼要在你的方法中創建一個Task?使用await。您基本上正在返回,您的流程可能會或可能無法完成,然後纔會被框架解除分配。

var stream = await Request.Content.ReadAsStreamAsync(); 

    using (FileStream fileStream = File.Create(String.Format(@"C:\HDP\{0}.xml", fileName), (int)stream.Length)) 
    { 
     byte[] bytesInStream = new byte[stream.Length]; 
     stream.Read(bytesInStream, 0, (int)bytesInStream.Length); 
     fileStream.Write(bytesInStream, 0, bytesInStream.Length); 
    } 
+0

其他人告訴我,幾天前,但將其更改爲Task導致它根本無法工作 - 當我這樣做時代碼從未達到。 – 2014-09-10 22:50:41

+0

異步將使用返回類型或不返回類型。如果他們想要返回類型,完全取決於開發人員。你有回調處理程序嗎?我會假設空文件的情況下拋出一個異常和沒有回叫處理程序你不知道。 – Ottak 2014-09-10 22:56:43

+0

返回'void',你不知道你的代碼是否崩潰。一個「任務」將捕獲異常。 – 2014-09-10 22:58:44