bool
값을 반환하는 메서드가 있습니다. 그 방법을 Thread
통해 실행하고 싶습니다.반환 형식의 스레드
Thread t1 = new Thread(new ThreadStart(doThis));
당신은 그 반환 값을 얻을 수있는 방법을 제안시겠습니까?
bool
값을 반환하는 메서드가 있습니다. 그 방법을 Thread
통해 실행하고 싶습니다.반환 형식의 스레드
Thread t1 = new Thread(new ThreadStart(doThis));
당신은 그 반환 값을 얻을 수있는 방법을 제안시겠습니까?
이상적으로 작업 병렬 라이브러리 및 Task<T>
을 사용하십시오. 그렇지 않으면 결과를 나타 내기 위해 일종의 공유 변수를 설정해야합니다. 스레드가 완료되면, 당신이 그것을 필요로 어떤 스레드에서 결과를 읽어 보시기 바랍니다.
을 또 다른 대안은 bool
를 반환하는 대리자를 사용하여 스레드 풀에 그것을 실행하는 대리자에 BeginInvoke
를 호출하는 것입니다, IAsyncResult
를 반환 그 결과를 기다릴 수 있습니다.
스레드에는 반환 값이 없습니다. 그러나 클래스의 스레드를 래핑하는 등의 해결 방법이 있습니다. 이 솔루션은 클래스를 사용하여 실행될 메소드 (간접적으로)와 반환 값을 저장합니다. 클래스는 모든 함수 및 모든 반환 형식에 사용할 수 있습니다. 반환 값 형식을 사용하여 개체를 인스턴스화 한 다음 함수를 전달하여 람다 (또는 대리자)를 통해 호출합니다.
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...
}
비동기 대리인을 피하기 위해 많은 작업이 필요합니다. –
당신은 스레드가 설정됩니다 멤버 변수를 가질 수는 다음 이벤트가 완료 될 때 스레드가 설정 한 것을 처리 만듭니다. 이벤트 핸들을 기다린 다음 핸들이 신호를 보낸 후 bool을 확인합니다.
결과를 기다리려면 왜 스레드를 사용해야합니까?
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);
// ...
}
을
결과를 기다리려면 왜 스레드를 사용해야합니까? ... 이유 중 하나는 개발자가 UI가 응답을하지 못하게하려는 경우 (예 : 작업이 잠시 동안 아마도 완성 될 때까지 기다려야 할 것입니다.) 이러한 상황에서 스레드를 사용하면인지 된 UI 응답 성을 향상시킬 수 있습니다. – Matt
@Matt Spinelli : 스레드를 생성 한 후 _immediately_ 기다리면 _ UI가 멈 춥니 다. –
그 이유는 응답 성이 좋다고 말한 이유입니다. 예,이 경우에는 앱이 계속 대기하지만 Vista 및 Windows 7에서 실행되는 데스크톱 앱의 경우 '응답하지 않는 창'메시지와 회색 창이 표시되지 않습니다. 귀하의 솔루션은 실제로보다 일반적인 비동기 목적으로 작동합니다. 그래서 +1. – Matt
일부 값을 반환하는 대리인을 제안하는 것은 아닙니다. 메소드가 실행과 함께 완료되면, 즉 "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;
}
static void Main(string[] args)
{
bool returnValue = false;
new Thread(
() =>
{
returnValue =test() ;
}).Start();
Console.WriteLine(returnValue);
Console.ReadKey();
}
public static bool test()
{
return true;
}
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
귀하의 경우에는, 당신은 아래의 코드처럼 뭔가를 할 수 있습니다
정말 TPL을 사용해야합니다. 이보다 더 쉽게 작업 할 수 있습니다. – Servy
가능한 [스레드에서 값을 반환 하시겠습니까?] (http : // stackoverflow.com/questions/1314155/returns-a-value-from-thread) –