[C#] Thread에서 ThreadStart 메소드에 매개 변수를 전달하는 방법은 무엇입니까?
Thread.ThreadStart()
C #에서 메서드에 매개 변수를 전달하는 방법은 무엇입니까?
‘다운로드’라는 메소드가 있다고 가정하십시오.
public void download(string filename)
{
// download code
}
이제 메인 메소드에 하나의 스레드를 만들었습니다.
Thread thread = new Thread(new ThreadStart(download(filename));
오류 메소드 유형이 예상됩니다.
매개 변수가 ThreadStart
있는 대상 메소드로 매개 변수를 전달하는 방법은 무엇입니까?
답변
가장 간단한 것은
string filename = ...
Thread thread = new Thread(() => download(filename));
thread.Start();
이것의 장점 ParameterizedThreadStart
은 여러 매개 변수를 전달할 수 있으며 object
항상 캐스팅하지 않아도 컴파일 타임을 확인할 수 있다는 것입니다.
답변
이 예를보십시오 :
public void RunWorker()
{
Thread newThread = new Thread(WorkerMethod);
newThread.Start(new Parameter());
}
public void WorkerMethod(object parameterObj)
{
var parameter = (Parameter)parameterObj;
// do your job!
}
먼저 대리자를 작업자 메서드에 전달하여 스레드를 만든 다음 개체를 매개 변수로 사용하는 Thread.Start 메서드로 시작합니다.
따라서 귀하의 경우 다음과 같이 사용해야합니다.
Thread thread = new Thread(download);
thread.Start(filename);
그러나 ‘다운로드’방법 은 매개 변수로 문자열이 아닌 객체 를 사용해야 합니다 . 메소드 본문에서 문자열로 캐스트 할 수 있습니다.
답변
ParameterizedThreadStart
매개 변수 를 사용하는 스레드 메서드에 대리자 를 사용하려고합니다 . (또는 실제로는 아무것도 없으며 Thread
생성자가 추론 하도록하십시오 .)
사용법 예 :
var thread = new Thread(new ParameterizedThreadStart(download));
//var thread = new Thread(download); // equivalent
thread.Start(filename)
답변
당신은 또한 delegate
좋아할 수 있습니다 …
ThreadStart ts = delegate
{
bool moreWork = DoWork("param1", "param2", "param3");
if (moreWork)
{
DoMoreWork("param1", "param2");
}
};
new Thread(ts).Start();
답변
추가로
Thread thread = new Thread(delegate() { download(i); });
thread.Start();
답변
스레드 함수 (다운로드) 및 필요한 매개 변수 (파일 이름)를 클래스에 캡슐화하고 ThreadStart 대리자를 사용하여 스레드 함수를 실행할 수 있습니다.
public class Download
{
string _filename;
Download(string filename)
{
_filename = filename;
}
public void download(string filename)
{
//download code
}
}
Download = new Download(filename);
Thread thread = new Thread(new ThreadStart(Download.download);
답변
File이라는 다른 클래스를 사용하는 것이 좋습니다.
public class File
{
private string filename;
public File(string filename)
{
this.filename= filename;
}
public void download()
{
// download code using filename
}
}
스레드 생성 코드에서 새 파일을 인스턴스화합니다.
string filename = "my_file_name";
myFile = new File(filename);
ThreadStart threadDelegate = new ThreadStart(myFile.download);
Thread newThread = new Thread(threadDelegate);