2011-08-04 18 views
3

私は仕事を使ってメールを送るのが好きです。これは、SendMailメソッドをenvokeに私のコードです:変数をタスクファクトリアクションに渡すにはどうしたらいいですか?

Task.Factory.StartNew(() => SendMail(toTextBox.Text, 
            subjectTextbox.Text, 
            BodyEditor.ContentHtml, 
            filenames.ToArray(), 
            ccTextBox.Text, 
            bccTextBox.Text)); 

問題は次のとおりです。オブジェクトが別のスレッドによって所有されているので、私はこのようなUI情報(テキストボックスなど。)渡すことはできません。

エラーメッセージ:呼び出し元のスレッドは、別のスレッドがそのオブジェクトを所有しているため、このオブジェクトにアクセスできません。

これらのパラメータを自分の行動にどのように渡すべきですか?

答えて

7

あなたはすでにあなたのUIスレッドですか?その場合は、ラムダ式が呼び出されたときにプロパティアクセスを既に実行しているように、プロパティを最初に抽出するだけで済みます。例えば

string recipient = toTextBox.Text; 
string subject = subjectTextBox.Text; 
string html = BodyEditor.ContentHtml; 
string cc = ccTextBox.Text; 
string bcc = bcTextBox.Text(); 

Task.Factory.StartNew(() => SendMail(recipient, 
            subject, 
            html, 
            filenames.ToArray(), 
            cc, 
            bcc)); 

は、変数がは、ラムダ式でをキャプチャされます - ラムダ式が評価されたときにように基本的にコンパイラは、情報を離れリスあなたのための余分なクラスを生成しますそれはまだ利用可能です。

このコードは、UIスレッドでないを実行している場合、あなたは基本的にでUIスレッドでそれを実行するために別のアクションを、全体をラップする必要があります。

Action action =() { 
    string recipient = toTextBox.Text; 
    string subject = subjectTextBox.Text; 
    string html = BodyEditor.ContentHtml; 
    string cc = ccTextBox.Text; 
    string bcc = bcTextBox.Text(); 

    Task.Factory.StartNew(() => SendMail(recipient, 
             subject, 
             html, 
             filenames.ToArray(), 
             cc, 
             bcc)); 
}; 

// Or Dispatcher.BeginInvoke(action); for WPF/Silverlight. 
BeginInvoke(action); 
+0

私はUIスレッドです。これは今動作します。くそーそれは簡単だった:)ヘルプのための高尚な。 – VDP

3

は、新しい変数を宣言しますUI変数の値を肉付けしてそれをタスクに渡す

string to = toTextBox.Text; 
string subject = subjectTextBox.Text; 
string cc = ccTextBox.Text; 
string bcc = bccTextBox.Text; 
string files = filenames.ToArray(); 

Task.Factory.StartNew(() => SendMail(to, subject,BodyEditor.ContentHtml, files, cc, bcc)); 
1

オブジェクトとそのプロパティを直接使用せず、代わりに値thあなたは変数に使用したいのですが、代りに変数を渡しますか?

関連する問題