我有一些有时有效的异步代码,有时却没有。使用此代码,始终创建文件,但有时它是空的(我总是发送包含内容的文件):
[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);
}
});
}
那么,我应该取消同步这个随机工作的代码吗,如果是的话,如何(如果没有变异的不同步性,那将会完成同样的事情(假设导致这种随机行为的问题))?
答案 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