我应该解除随机异步工作代码吗?

时间:2014-09-10 22:45:13

标签: c# http-post task-parallel-library async-await filestream

我有一些有时有效的异步代码,有时却没有。使用此代码,始终创建文件,但有时它是空的(我总是发送包含内容的文件):

[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);
        }
    });
}

那么,我应该取消同步这个随机工作的代码吗,如果是的话,如何(如果没有变异的不同步性,那将会完成同样的事情(假设导致这种随机行为的问题))?

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:3)

随机工作的代码是随机的,因为您返回了一个空格,并且异步框架在完成时无法获得回调。对于返回async的{​​{1}}方法,请将其更改为返回void

另外,为什么要在方法中创建Task?使用Task。您已基本返回,并且您的流程可能会或可能不会在框架解除分配之前完成。

await