1

Ayncメソッドを使用しようとしています。ある意味で機能しています。しかし、それは他の状況では機能していません。

実例

dropBox.DownloadFileAsync(csvEntry.Path)
                    .ContinueWith(task =>
                    {
                        // Save file to "C:\Spring Social.txt"
                        using (FileStream fileStream = new FileStream(tempCsvPath, FileMode.Create))
                        {
                            fileStream.Write(task.Result.Content, 0, task.Result.Content.Length);
                        }
                    });

ファイルを保存する代わりに、次の方法でバイト配列を返そうとしています。しかし、それは機能していません。nullを返しています。

 byte[] returnArray = null;
                dropbox.DownloadFileAsync(filePath)
                        .ContinueWith(task =>
                        {
                            returnArray = new byte[task.Result.Content.Length];
                            task.Result.Content.CopyTo(returnArray, 0);
                        });
                return returnArray;

誰かが私を訂正できますか?

ありがとう

4

1 に答える 1

4

このコードでは:

            byte[] returnArray = null;
            dropbox.DownloadFileAsync(filePath)
                    .ContinueWith(task =>
                    {
                        returnArray = new byte[task.Result.Content.Length];
                        task.Result.Content.CopyTo(returnArray, 0);
                    });
            return returnArray;

DownloadFileAsync() はスレッドで実行されます。ContinueWith() が実行されると、DowloadFileAsync() を呼び出す関数は既に返されています。

次のようにする必要があります。

     Task<T> Download(string filePath)
     {             
            return dropbox.DownloadFileAsync(filePath)
                    .ContinueWith(task =>
                    {
                        returnArray = new byte[task.Result.Content.Length];
                        task.Result.Content.CopyTo(returnArray, 0);

                        return returnArray;
                    });
      }

次のように呼び出します。

     var task = Download("myfile");

     task.ContinueWith(t => 
      { 
           var returnArray = t.Result;
           ...

      }
于 2012-12-12T23:57:28.397 に答える