2016-11-10 9 views
2

ファイルをアップロードするためにWinSCP .NETアセンブリを使用しています。私は複数のファイルを非同期でアップロードしたい。私はメソッドを作成しましたが、単一のアップロードとして機能します。C#WinSCP .NETアセンブリ:複数のファイルを非同期にアップロードする方法

public class UploadingData { 

    private SessionOptions _sessionOptions; 
    private Session _session; 

    //connection etc 

    private void OnConnected() { 

     foreach (var fileInfo in localFilesList) 
     { 
      var task = Task.Factory.StartNew(() => UploadFilesAsync(fileInfo)); 
     } 
    } 

    private async Task UploadFilesAsync(string file) { 

     string remoteFilePath = _session.TranslateLocalPathToRemote(file, @"/", "/test_data_upload"); 
     var uploading = _session.PutFiles(file, remoteFilePath, false); 

     //When Done 

     await Task.Run(() => Thread.Sleep(1000)); 
    } 
} 

正しい方法を教えてください。おかげ

答えて

1

あなたはこのようにBackgroundWorkerのクラスを使用することができます。

 string[] images = new string[50]; 
     foreach (var path in images) 
     { 
      BackgroundWorker w = new BackgroundWorker(); 
      //50 independently async Threads 
      w.DoWork += delegate (object s, DoWorkEventArgs args) 
      { 
       Upload(args.Argument.ToString()); 
      }; 
      w.RunWorkerAsync(path); 
     } 
+0

何千ものファイルをアップロードする必要がある場合は、数千人のバックグラウンドワーカーが必要です。アプリケーションとCPUは問題ありませんか? –

+1

1つのアプリケーションで数千のtheadを使用するのは良い方法ではありません。アプリケーションのスレッド数が増えるほど、各スレッドの実行時間が短縮されます。たとえば、50-50で何千ものファイルを分離し、各非同期スレッドを50個の非同期スレッドで順次アップロードできます。 –

+0

@Martinは、セッションクラスはすべてのファイルをキューに入れると述べています。 –

1

Session classのAPIは、単一のスレッドから使​​用することができます。複数のスレッドから使​​用すると、ブロックされます。

パラレル転送が必要な場合は、スレッドごとに個別のSessionインスタンスを作成する必要があります。

private async Task UploadFilesAsync(string file) 
{ 
    using (Session session = new Session()) 
    { 
     session.Open(_sessionOptions); 
     string remoteFilePath = 
      RemotePath.TranslateLocalPathToRemote(file, @"/", "/test_data_upload"); 
     session.PutFiles(file, remoteFilePath, false).Check(); 
    } 

    ... 
} 
+0

10から20のセッションを作成するとパフォーマンス上の問題はありますか? –

+1

これはかなり広い質問です。クライアントまたはサーバーの問題?一部のサーバーでは、その数のセッションを開くことができません。また、約3つ以上のセッションを作成することは意味がありません。より多くのセッションでは、より良いスループットを得ることはほとんどありません。 –

関連する問題