카테고리 보관물: C#

C#

파라미터가있는 ThreadStart 변수를 사용하여 스레드를 어떻게 시작합니까?

C #에서 매개 변수를 사용하여 스레드를 어떻게 시작합니까?



답변

: :

Thread t = new Thread (new ParameterizedThreadStart(myMethod));
t.Start (myParameterObject);


답변

Thread 생성자의 오버로드 중 하나는 하나의 매개 변수를 start 메서드에 전달할 수있는 ParameterizedThreadStart 대리자를 사용합니다. 불행히도 단일 매개 변수 만 허용하고 객체로 전달하기 때문에 안전하지 않은 방식으로 수행합니다. 람다 식을 사용하여 관련 매개 변수를 캡처하고 강력한 형식으로 전달하는 것이 훨씬 쉽다는 것을 알았습니다.

다음을 시도하십시오

public Thread StartTheThread(SomeType param1, SomeOtherType param2) {
  var t = new Thread(() => RealStart(param1, param2));
  t.Start();
  return t;
}

private static void RealStart(SomeType param1, SomeOtherType param2) {
  ...
}


답변

람다 식을 사용할 수 있습니다

private void MyMethod(string param1,int param2)
{
  //do stuff
}
Thread myNewThread = new Thread(() => MyMethod("param1",5));
myNewThread.Start();

이것은 지금까지 내가 찾은 최고의 답변입니다. 빠르고 쉽습니다.


답변

Thread thread = new Thread(Work);
thread.Start(Parameter);

private void Work(object param)
{
    string Parameter = (string)param;
}

매개 변수 유형은 객체 여야합니다.

편집하다:

이 답변이 올바르지는 않지만이 접근법에 반대하는 것이 좋습니다. 람다 식을 사용하면 훨씬 쉽게 읽을 수 있으며 형식 캐스팅이 필요하지 않습니다. 여기를 참조하십시오 : https://stackoverflow.com/a/1195915/52551


답변

class Program
{
    static void Main(string[] args)
    {
        Thread t = new Thread(new ParameterizedThreadStart(ThreadMethod));

        t.Start("My Parameter");
    }

    static void ThreadMethod(object parameter)
    {
        // parameter equals to "My Parameter"
    }
}


답변

람다를 사용하는 간단한 방법 ..

Thread t = new Thread(() => DoSomething("param1", "param2"));
t.Start();

또는 당신도 그렇게 delegate사용할 ThreadStart수 있습니다 …

ThreadStart ts = delegate
{
     bool moreWork = DoWork("param1", "param2", "param3");
     if (moreWork)
     {
          DoMoreWork("param4", "param5");
     }
};
new Thread(ts).Start();

또는 VS 2019 .NET 4.5 이상을 사용하여 더 깨끗합니다.

private void DoSomething(int param1, string param2)
{
    //DO SOMETHING..
    void ts()
    {
        if (param1 > 0) DoSomethingElse(param2, "param3");
    }
    new Thread(ts).Start();
    //DO SOMETHING..
}


답변

사용하십시오 ParametrizedThreadStart.