5

いいえ、そのような基本的な質問ではありません。私はアプリケーションを実行していて、ファイルがダウンロードされてから FTP サーバーにアップロードされ、ローカル コピーが削除され、そのファイル名の辞書に 1 つのエントリが配置されるようなシナリオが得られました。というわけで、コードは以下

public void download_This_WebPage(string url, string cookies_String, string local_Saving_File_Name_With_Path)
{
    WebClient wb = new WebClient();
    wb.Headers.Add(HttpRequestHeader.Cookie, cookies_String);
    // Below I want to pass this local_File _Path to the event handler
    wb.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(wb,);
    wb.DownloadFileAsync(new Uri(url), local_Saving_File_Name_With_Path + ".html");
}

public void data_Download_Completed(Object sender, System.ComponentModel.AsyncCompletedEventArgs args)
{
      //use the file name to upload the file to FTP

}

public FTP_Completed
{
    // Delete the file
}

しかし、そのファイル名を download_Completed のイベント ハンドラに渡す方法がわかりません。誰でもこれで私を案内できますか

編集: 「ダーリン」と「フレデリック」からの回答ありがとうございます。カスタム データを (定義済みの) イベント ハンドラに渡す一般的な方法はありますか?

void main_Fn()
{
    string my_Data = "Data";
    some_object a = new some_object();
    some_Object.click_event += new eventHandler(click_Happened);
    (Assume that the event passes two ints, I also want to pass the string "my_Data"
      to "click_Happened")
    some_object.start();
}

void click_Happened(int a, int b)
{
   // I want to get the string "my_Data" here. 
}

要するに、署名をだます方法は?

4

2 に答える 2

7

DownloadFileAsync()userTokenの引数にファイル名を渡すことができます。操作が終了すると、次のアドレスに渡されるAsyncCompletedEventArgs引数のプロパティで使用できるようになります。UserStatedata_Download_Completed()

string filename = local_Saving_File_Name_With_Path + ".html";
wb.DownloadFileAsync(new Uri(url), filename, filename);

それで:

public void data_Download_Completed(Object sender,
    System.ComponentModel.AsyncCompletedEventArgs args)
{
    string filename = (string) args.UserState;
    // Now do something with 'filename'...
}
于 2012-07-02T09:31:20.843 に答える
1

メソッドの3番目の引数を使用して、完成したハンドラーにDownloadFileAsyncを渡すことができます。UserState

// subscribe to the completed event
wb.DownloadFileCompleted += data_Download_Completed;
string file = local_Saving_File_Name_With_Path + ".html";
wb.DownloadFileAsync(new Uri("url"), file, file);

ハンドラー内:

public void data_Download_Completed(Object sender, AsyncCompletedEventArgs args)
{
    // extract the filename from the UserState of the args
    string file = args.UserState as string;
    ...

}
于 2012-07-02T09:31:14.243 に答える