using System;
using System.Threading;
using System.Threading.Tasks;
...
#region 테스트 1 대리자 - Test1Delegate(threadName)
/// <summary>
/// 테스트 1 대리자
/// </summary>
/// <param name="threadName">스레드명</param>
/// <returns>처리 결과</returns>
private delegate string Test1Delegate(string threadName);
#endregion
#region 콜백 처리하기 - Callback(asyncResult)
/// <summary>
/// 콜백 처리하기
/// </summary>
/// <param name="asyncResult">비동기 결과</param>
private void Callback(IAsyncResult asyncResult)
{
int threadID = Thread.CurrentThread.ManagedThreadId;
bool isThreadPoolThread = Thread.CurrentThread.IsThreadPoolThread;
Console.WriteLine("[{0} 스레드] 콜백 처리를 시작합니다...", threadID);
Console.WriteLine("[{0} 스레드] 콜백 전달 상태 값 : {1}", threadID, asyncResult.AsyncState);
Console.WriteLine("[{0} 스레드] 스레드 풀 스레드 여부 : {1}", threadID, isThreadPoolThread);
Console.WriteLine("[{0} 스레드] 콜백 처리를 종료합니다...", threadID);
}
#endregion
#region 테스트 1 처리하기 - Test1(threadName)
/// <summary>
/// 테스트 1 처리하기
/// </summary>
/// <param name="threadName">스레드명</param>
/// <returns>처리 결과</returns>
private string Test1(string threadName)
{
int threadID = Thread.CurrentThread.ManagedThreadId;
bool isThreadPoolThread = Thread.CurrentThread.IsThreadPoolThread;
Console.WriteLine("[{0} 스레드] 테스트 1 처리를 시작합니다...", threadID);
Console.WriteLine("[{0} 스레드] 스레드 풀 스레드 여부 : {1}", threadID, isThreadPoolThread);
Thread.Sleep(TimeSpan.FromSeconds(2));
Thread.CurrentThread.Name = threadName;
Console.WriteLine("[{0} 스레드] 테스트 1 처리를 종료합니다...", threadID);
return Thread.CurrentThread.Name;
}
#endregion
#region 테스트 2 처리하기 - Test2(precedingTask)
/// <summary>
/// 테스트 2 처리하기
/// </summary>
/// <param name="precedingTask">선행 태스크</param>
private void Test2(Task<string> precedingTask)
{
int threadID = Thread.CurrentThread.ManagedThreadId;
bool isThreadPoolThread = Thread.CurrentThread.IsThreadPoolThread;
Console.WriteLine("[{0} 스레드] 테스트 2 처리를 시작합니다...", threadID);
Console.WriteLine("[{0} 스레드] 선행 태스크 결과 : {1}", threadID, precedingTask.Result);
Console.WriteLine("[{0} 스레드] 테스트 2 처리를 종료합니다...", threadID);
}
#endregion
...
Test1Delegate test1Delegate = Test1;
Task<string> task = Task<string>.Factory.FromAsync
(
test1Delegate.BeginInvoke("thread1", Callback, "상태값 #1"),
test1Delegate.EndInvoke
);
task.ContinueWith(precedingTask => Test2(precedingTask));
while(!task.IsCompleted)
{
Console.WriteLine(task.Status);
Thread.Sleep(TimeSpan.FromSeconds(0.5));
}
Console.WriteLine(task.Status);
Thread.Sleep(TimeSpan.FromSeconds(1));