2011-08-04 6 views
3

저는 작업을 사용하여 메일을 보내고 싶습니다. 객체가 다른 스레드가 소유하고 있기 때문에이 같은 (텍스트 상자 등) 나 UI 정보를 전달할 수 없습니다작업 공장 작업에 변수를 전달하는 방법은 무엇입니까?

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

문제 :이 센드 메일의 방법을 envoke 내 코드입니다.

오류 메시지 : 다른 스레드가 소유하고 있기 때문에 호출 스레드가이 개체에 액세스 할 수 없습니다.

조치에이 매개 변수를 어떻게 전달해야합니까?

답변

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)); 

변수가 될 것입니다 람다 식으로을 캡처 한 - 기본적으로 컴파일러는 람다 표현식이 평가 될 때 있도록 정보를 멀리 다람쥐하는 당신을 위해 별도의 클래스를 생성합니다 여전히 사용할 수 있습니다.

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 스레드에서 하지를 실행하면, 당신은 기본적으로 UI 스레드를 실행하기 위해, 다른 조치를 전체를 포장 할 필요가 그 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 변수에 사용하기를 원한다면 대신에 변수를 전달할 것인가?

관련 문제