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

을해야 I 해제 Asyncify이 무작위로 작업 코드와, 만약 그렇다면, 어떻게 (unsyncness의 모호함없이 같은 것을 성취 할 수있는 것은 무엇인가? (이 무작위적인 행동을 일으키는 문제라고 가정))?

답변

5

await 키워드를 사용해 보셨습니까? 내 생각 엔 SendInventoryXML 메서드가 끝나면 Request 개체가 할당 취소됩니다. ReadStreamAsync() 메서드를 호출 한 직후에 완료 될 때까지 기다리지 않고 완료됩니다. 기다리는 키워드는 결과를 기다려야합니다.

[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가 반환되고 완료되면 비동기 프레임 워크에서 콜백을받을 수있는 방법이 없기 때문입니다. void을 반환하는 async 메서드의 경우 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

다른 사람이 며칠 전,하지만 작업으로 변경하면 전혀 작동하지 않아 - 내가 그랬을 때 코드에 도달하지 못했습니다. –

+0

비동기는 반환 유형 또는 반환 유형이없는 경우 작동합니다. 반환 유형을 원할 경우 개발자에게 전적으로 의존하십시오. 콜백 처리기가 있습니까? 나는 빈 파일의 경우 Exception을 던지고 콜백 핸들러가 없다고 가정 할 것이다. – Ottak

+0

'void '를 반환하면 코드가 충돌하는지 알 수 없습니다. 'Task'는 예외를 잡아낼 것입니다. –

관련 문제