2017-01-04 5 views
0

私の質問にはWeb APIが関係しています。asp.net/c#を使用して作成し、Azureサーバーにデプロイします。 APIは、基本的に、画像の上に何らかのテキストが印刷された画像を処理する要求を受け取ります。メソッドを非同期に呼び出す、または独自のスレッドでパフォーマンスを向上させる

私はget要求を受け取った後に呼び出されるメソッドを持っています。英語では、このメソッドはいくつかの設定を行い、次にAzureブロブストレージから要求された適切なイメージをダウンロードし、次に描画を行います。

public HttpResponseMessage process(string image){ 

DoSomeSetup(); 

DownloadFromBlob(image); 

return DrawTextOnImage(); 
} 

私の問題は、Azure BLOBからのダウンロードでは、すべての操作の中で最長の時間、通常は2〜3秒かかることです。私は、時間を節約するためにセットアップが行われている間にイメージをダウンロードすることができれば、はるかに効率的であると考えています。

public HttpResponseMessage process(string image){ 

startDownloadingImageFromBlob(image); 

DoSomeSetup(); 

EnsureImageDownloadFinished(); 

return DrawTextOnImage(); 
} 

私は単にメソッドの先頭に

Bitmap templateImage = DownloadImageFromUrl(BLOB_STORAGE_TEMPLATES_BASE_URL) 

を呼び出すと、セットアップに移動する前に、ダウンロードが完了するのを待ちます印象でいます。セットアップと同時にダウンロードが実行されるようにする方法はありますか?必要に応じて、描画前に完了するまで待ってください。

+0

、チャンスはあなたが実際に非同期的にダウンロードするに試みることによって(imperceivable)パフォーマンスの低下が表示されますされています。 –

答えて

2

あなたはは、ASP.NETにWaitまたはTask.Runを使用しないでください。

ダウンロードはI/Oベースの操作なので、非同期のアプローチが最も理にかなっています。 の最初のは、どのAPIがDownloadFromBlobによって呼び出されているかを識別し、それらを非同期の同等物に変更し、awaitを使用して呼び出します。次に、そこからasyncが成長するようにします(コンパイラがガイドします)。セットアップされた後、タスクを

async Task<Bitmap> DownloadFromBlobAsync(string image); 

そして、この時点で、あなたは(INGのawaitしかしない)呼び出すことによってダウンロードを開始することができる方法、およびそれからawait:結局、あなたのようなものになってしまいます行わ: `DoSomeSetup()`もIOが結合した、または特にCPUを集中されていない限り

public async Task<HttpResponseMessage> process(string image) 
{ 
    var task = DownloadFromBlobAsync(image); 
    var setupData = DoSomeSetup(); 
    var image = await task; 
    return DrawTextOnImage(image, setupData); 
} 
0

実行するタスクを並行して実行し、タスクが完了するまで待ってから続行することができます。このような何か:

// using System.Threading.Tasks; 
public HttpResponseMessage process(string image) { 

    var downloadTask = Task.Run(() => { 
     DownloadFromBlob(image); 
    }); 

    DoSomeSetup(); 

    downloadTask.Wait(); 

    return DrawTextOnImage(); 
} 

参考:MSDN Task Class

+0

これはまさに私が探していたものです。私はいくつかのパフォーマンステストを行い、期待どおりに動作するかどうかを確認します。もしそうなら、私は返事を受け取り、答えを受け入れるでしょう。ありがとう! – Jaked222

+5

ですが、ダウンロードはIO操作です。別の余分なスレッドを必要としない非同期ダウンロードメソッドはありませんか? –

+1

OPは、Asp.netのタスクで.Waitを呼び出すとトローリングの試行を見るのに十分な経験がない可能性が高いです... –

関連する問題