2011-03-08 3 views
1

bool 값을 반환하는 메서드가 있습니다. 그 방법을 Thread 통해 실행하고 싶습니다.반환 형식의 스레드

Thread t1 = new Thread(new ThreadStart(doThis));

당신은 그 반환 값을 얻을 수있는 방법을 제안시겠습니까?

+0

가능한 [스레드에서 값을 반환 하시겠습니까?] (http : // stackoverflow.com/questions/1314155/returns-a-value-from-thread) –

답변

8

이상적으로 작업 병렬 라이브러리 및 Task<T>을 사용하십시오. 그렇지 않으면 결과를 나타 내기 위해 일종의 공유 변수를 설정해야합니다. 스레드가 완료되면, 당신이 그것을 필요로 어떤 스레드에서 결과를 읽어 보시기 바랍니다.

을 또 다른 대안은 bool를 반환하는 대리자를 사용하여 스레드 풀에 그것을 실행하는 대리자에 BeginInvoke를 호출하는 것입니다, IAsyncResult를 반환 그 결과를 기다릴 수 있습니다.

6

스레드에는 반환 값이 없습니다. 그러나 클래스의 스레드를 래핑하는 등의 해결 방법이 있습니다. 이 솔루션은 클래스를 사용하여 실행될 메소드 (간접적으로)와 반환 값을 저장합니다. 클래스는 모든 함수 및 모든 반환 형식에 사용할 수 있습니다. 반환 값 형식을 사용하여 개체를 인스턴스화 한 다음 함수를 전달하여 람다 (또는 대리자)를 통해 호출합니다.

public class ThreadedMethod<T> 
{ 

    private T result; 
    public T Result 
    { 
     get { return result; } 
     private set { result = value; } 
    } 

    public ThreadedMethod() 
    { 
    } 

    //If supporting .net 3.5 
    public void ExecuteMethod(Func<T> func) 
    { 
     Result = func.Invoke(); 
    } 

    //If supporting only 2.0 use this and 
    //comment out the other overload 
    public void ExecuteMethod(Delegate d) 
    { 
     Result = (T)d.DynamicInvoke(); 
    } 
} 

이 코드를 사용하려면 람다 (또는 대리자)를 사용할 수 있습니다. 여기에 람다를 사용하는 예는 다음과 같습니다

ThreadedMethod<bool> threadedMethod = new ThreadedMethod<bool>(); 
Thread workerThread = new Thread((unused) => 
          threadedMethod.ExecuteMethod(() => 
           SomeMethod())); 
workerThread.Start(); 
workerThread.Join(); 
if (threadedMethod.Result == false) 
{ 
    //do something about it... 
} 
+1

비동기 대리인을 피하기 위해 많은 작업이 필요합니다. –

0

당신은 스레드가 설정됩니다 멤버 변수를 가질 수는 다음 이벤트가 완료 될 때 스레드가 설정 한 것을 처리 만듭니다. 이벤트 핸들을 기다린 다음 핸들이 신호를 보낸 후 bool을 확인합니다.

5

결과를 기다리려면 왜 스레드를 사용해야합니까?

bool result = doThis(); 

일반적으로 비동기 실행과 함께, 당신은 결과를 얻기 위해 콜백을 설정하는 것 :

Func<bool> handle = doThis; 
handle.BeginInvoke(Callback, handle); // asynchronous invocation 
// can do more work... 

을 그리고 당신은이 같은 콜백의 결과를 얻을 것이다 :

void Callback(IAsyncResult ar) { 
    bool result = ((Func<bool>)ar.AsyncState).EndInvoke(ar); 
    // ... 
} 
+0

결과를 기다리려면 왜 스레드를 사용해야합니까? ... 이유 중 하나는 개발자가 UI가 응답을하지 못하게하려는 경우 (예 : 작업이 잠시 동안 아마도 완성 될 때까지 기다려야 할 것입니다.) 이러한 상황에서 스레드를 사용하면인지 된 UI 응답 성을 향상시킬 수 있습니다. – Matt

+0

@Matt Spinelli : 스레드를 생성 한 후 _immediately_ 기다리면 _ UI가 멈 춥니 다. –

+0

그 이유는 응답 성이 좋다고 말한 이유입니다. 예,이 경우에는 앱이 계속 대기하지만 Vista 및 Windows 7에서 실행되는 데스크톱 앱의 경우 '응답하지 않는 창'메시지와 회색 창이 표시되지 않습니다. 귀하의 솔루션은 실제로보다 일반적인 비동기 목적으로 작동합니다. 그래서 +1. – Matt

0

일부 값을 반환하는 대리인을 제안하는 것은 아닙니다. 메소드가 실행과 함께 완료되면, 즉 "out"매개 변수를 사용하여 메소드에서 일부 값을 얻는 것이 더 나은 접근 방법입니다.

public delegate void DoThisWithReturn(out bool returnValue); 

public static void DoThisMethod(out bool returnValue) 
{ 
    returnValue = true; 
} 

public static void Start() 
{ 

    var delegateInstance = new DoThisWithReturn(DoThisMethod); 
    bool returnValue; 
    var asyncResult = delegateInstance.BeginInvoke(out returnValue, null, null); 
    //Do Some Work.. 
    delegateInstance.EndInvoke(out returnValue, asyncResult); 
    var valueRecievedWhenMethodDone = returnValue; 
} 
1
static void Main(string[] args) 
    { 
     bool returnValue = false; 
     new Thread(
     () => 
      { 
       returnValue =test() ; 
      }).Start(); 
     Console.WriteLine(returnValue); 
     Console.ReadKey(); 
    } 

    public static bool test() 
    { 
     return true; 
    } 
0
public class ThreadExecuter<t> where T : class 
{ 
    public delegate void CallBack (T returnValue); 
    public delegate T Method(); 
    private CallBack callBack; 
    private Method method; 

    private Thread t; 

    public ThreadExecuter(Method _method, CallBack _callBack) 
    { 
     this.method = _method; 
     this.callBack = _callBack; 

     t = new Thread(this.Process); 
    } 

    public void Start() 
    { 
     t.Start(); 
    } 

    public void Abort() 
    { 
     t.Abort(); 
     callBack(null); 
    } 

    public void Join() 
    { 
     t.Join(); 
    } 

    private void Process() 
    { 
     callBack(method()); 
    } 
} 

사용 :

namespace Tester 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      #region [ Paket Data] 
      ... 
      #endregion 

      for (int i = 0; i < 20; i++) 
      { 
       Packet packet = new Packet() { Data = data, Host = "www.google.com.tr", Port = 80, Id = i }; 
       SocketManager sm = new SocketManager() { packet = packet }; 

       <b> ThreadExecuter<packet> te = new ThreadExecuter<packet>(sm.Send, writeScreen); 
       te.Start();</packet></packet></b> 
      } 

      Console.WriteLine("bitti."); 
      Console.ReadKey(); 
     } 

     private static void writeScreen(Packet p) 
     { 
      Console.WriteLine(p.Id + " - " + p.Status.ToString()); 
     } 
    } 
} 

출처 : http://onerkaya.blogspot.com/2013/04/returning-value-from-thread-net.html

귀하의 경우에는

, 당신은 아래의 코드처럼 뭔가를 할 수 있습니다

+0

정말 TPL을 사용해야합니다. 이보다 더 쉽게 작업 할 수 있습니다. – Servy

관련 문제