2017-11-15 18 views
0

現在、サーバーからファイルをダウンロードする同期メソッドがあるコンポーネントを作成しています。ここに署名があります:同期メソッドの非同期バージョンを作成する

public Stream DownloadFile(IData data) 

今私は、このメソッドの非同期バージョンを持っていると思ったし、これを試してみました:

public async Task<Stream> DownloadFileAsync(IData data) 
{ 
    Stream stream = null; 
    await Task.Run(() => 
    { 
     DownloadFile(data); 
    }); 
    return stream; 
} 

をしかしReSharperのは、「式は常にnullである」return stream;の下で私の波線ラインを示しています。誰かが自分のコードに何が間違っているか教えてもらえますか?

私がやりたいことは、バックグラウンドでDownloadFileメソッドを実行し、呼び出し側にコントロールフローを返すことです。

EDIT:ここDownloadFileメソッドは次のとおりです。

var ms = new MemoryStream(); 

    using (var dtService = new DataTransferService(mConnectionInfo)) 
    { 
    int bytesRead; 
    do 
    { 
     var buffer = new byte[data.ChunkSize]; 
     bytesRead = dtService.Read(data, buffer); 

     if (bytesRead == 0) 
     { 
     break; 
     } 

     data.Offset += bytesRead; 
     ms.Write(buffer, 0, buffer.Length); 
    } while (bytesRead > 0); 
    } 


    return ms; 

おかげ

+0

をあなたは、ストリームを保存し、それを返さないあなたはこれだけを返しますヌルです;ヌルです – EpicKip

+2

[C#で同期メソッドから非同期メソッドを呼び出す方法?](https://stackoverflow.com/questions/9343594/how-to-call-asynchronous-method-from-synchronous- method-in-c) – Liam

+4

あなたがしようとしているのは、非同期のアンチパターンの同期です。[これをしないでください](http://blog.stephencleary.com/2012/07/dont-block-on-async- code.html)。非同期の全ポイントはどこにでも実装する必要があるということです。 – Liam

答えて

3

最良のオプションは、HttpClientを持つ例えば、非同期I/Oを使用してDownloadFile()方法を書き換えることであろう。

現在のDownloadFile()をラッパーで非同期にすることは無意味です。
あなたは被害の最小量しながら、それだけで偽その後、要件と特定のインフラストラクチャの間で立ち往生している場合: `ストリームstream =:

public Task<Stream> DownloadFileAsync(IData data) // not 'async', just Task<> 
{ 
    return Task.FromResult(DownloadFile(data)); 
} 
+0

ありがとう、私は今それを得たと思う。私がいくつかの.netメカニズムを使用して非同期メソッドを構築していた場合、私は独自の非同期メソッドを実装することができました。これは 'HttpClient.AnyAsyncMethod'のようなものです。しかし、この場合、 'DataTransferService'は、非同期メソッドを公開していないサーバからデータを取得するために何らかのプロキシを呼び出します。だから、私のために非同期メソッドを公開することは意味をなさないので、私はあなたのソリューションに行き、単に 'Task 'を返しますか? – user3292642

+0

本当に非同期バージョンが必要な場合は、それをFromResult()でラップします。 [実装でTask.Runを使用しない](https://blog.stephencleary.com/2013/11/taskrun-etiquette-examples-dont-use.html)も参照してください。 –

0

あなたが実際にストリーム変数に割り当てるのを忘れて:あなたはstream変数を返すので

public async Task<Stream> DownloadFileAsync(IData data) 
{ 
    Stream stream = null; 
    await Task.Run(() => 
    { 
     // VVV 
     stream = DownloadFile(data); 
    }); 
    return stream; 
} 
2

を、そしてそれはnullです。 )

Task

public async Task<Stream> DownloadFileAsync(IData data) 
{ 
    return await Task.Run(() => DownloadFile(data)); 
} 
関連する問題