2017-09-19 11 views
0

アップロードプロセスを処理する非同期プロセスを実行できるAPIを作成しようとしていて、すぐにファイルアップロードプロセスが開始されたことをユーザーに伝えます。ここから、アップロードのステータスを尋ねるポーリングを行うAPIを作成したいと思います。C#Web APIファイルを非同期でアップロードする

これはネットワーキングのスペースで実現可能ですか?そうでなければ、ファイル全体が処理されるまで待たなければならないが、そのAPIは依然として複数のリクエストで利用できるのだろうか?

ここまでは私のコードですが、現在は投稿の特定のバイトに達して失敗します。

public async Task<IHttpActionResult> Post() 
{ 
    var stream = HttpContext.Current.Request.GetBufferlessInputStream(true); 
    // Begin Upload 
    Task.Run(() => BeginUpload(stream)); 

    // Return upload begin successful 
    return Ok($"Upload started! # {0}"); 
} 

private async Task<int> BeginUpload(Stream stream) 
{ 
    using (var reader = new StreamReader(stream)) 
    { 
     var index = 0; 
     var buffer = new char[100000000]; 

     while (!reader.EndOfStream) 
     { 
      await reader.ReadBlockAsync(buffer, index, 1024); 
      index += 1024; 
      Debug.Write($"{index}\n"); 
     } 
    } 

    return 0; 
} 

答えて

0

Task.Run()を使用する代わりに、HostingEnvironment.QueueBackgroundWorkItemと考えることができます。たとえば:

public IHttpActionResult Post() 
    { 
     var stream = HttpContext.Current.Request.GetBufferlessInputStream(true); 
     // Begin Upload 
     HostingEnvironment.QueueBackgroundWorkItem(async cancellationToken => await BeginUpload(stream)); 

     // Return upload begin successful 
     return Ok($"Upload started! # {0}"); 
    } 

    private async Task BeginUpload(Stream stream) 
    { 
     using (var reader = new StreamReader(stream)) 
     { 
      var index = 0; 
      var buffer = new char[100000000]; 

      while (!reader.EndOfStream) 
      { 
       await reader.ReadBlockAsync(buffer, index, 1024); 
       index += 1024; 
       Debug.Write($"{index}\n"); 
      } 
     } 
    } 

この場合、読者が作業を終えるまで待つ必要はありません。

関連する問題