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