2014-09-10 48 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