728x90
반응형
728x170
▶ GetTextAsyncStateMachine.cs
using System;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
namespace TestProject
{
/// <summary>
/// 텍스트 구하기 비동기 상태 머신
/// </summary>
public class GetTextAsyncStateMachine : IAsyncStateMachine
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 프로그램
/// </summary>
public Program Program;
/// <summary>
/// 비동기 태스크 메소드 빌더
/// </summary>
public AsyncTaskMethodBuilder<string> Builder;
/// <summary>
/// 상태
/// </summary>
public int State;
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 태스크 대기자
/// </summary>
private TaskAwaiter<string> taskAwaiter;
/// <summary>
/// 문자열 태스크
/// </summary>
private Task<string> stringTask;
/// <summary>
/// 텍스트
/// </summary>
private string text;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Public
#region (IAsyncStateMachine) 다음으로 이동하기 - MoveNext()
/// <summary>
/// 다음으로 이동하기
/// </summary>
public void MoveNext()
{
try
{
TaskAwaiter<string> taskAwaiter;
switch(State)
{
case 0 :
taskAwaiter = this.taskAwaiter;
this.taskAwaiter = new TaskAwaiter<string>();
State = -1;
break;
default :
this.stringTask = new TaskFactory().StartNew(() => { return "TEST"; });
taskAwaiter = this.stringTask.GetAwaiter();
if(taskAwaiter.IsCompleted == false)
{
State = 0;
this.taskAwaiter = taskAwaiter;
GetTextAsyncStateMachine asyncStateMachine = this;
Builder.AwaitUnsafeOnCompleted(ref taskAwaiter, ref asyncStateMachine);
return;
}
break;
}
this.text = taskAwaiter.GetResult();
}
catch(Exception exception)
{
State = -2;
Builder.SetException(exception);
return;
}
State = -2;
Builder.SetResult(this.text);
}
#endregion
#region (IAsyncStateMachine) 상태 머신 설정하기 - SetStateMachine(asyncStateMachine)
/// <summary>
/// 상태 머신 설정하기
/// </summary>
/// <param name="asyncStateMachine">비동기 상태 머신</param>
public void SetStateMachine(IAsyncStateMachine asyncStateMachine)
{
}
#endregion
}
}
728x90
▶ CallAsyncStateMachine.cs
using System;
using System.Runtime.CompilerServices;
namespace TestProject
{
/// <summary>
/// 호출하기 비동기 상태 머신
/// </summary>
public class CallAsyncStateMachine : IAsyncStateMachine
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 프로그램
/// </summary>
public Program Program;
/// <summary>
/// 비동기 태스크 메소드 빌더
/// </summary>
public AsyncTaskMethodBuilder Builder;
/// <summary>
/// 상태
/// </summary>
public int State;
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 태스크 대기자
/// </summary>
private TaskAwaiter<string> taskAwaiter;
/// <summary>
/// 현재 시간
/// </summary>
private string currentTime;
/// <summary>
/// 텍스트
/// </summary>
private string text;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Public
#region (IAsyncStateMachine) 다음으로 이동하기 - MoveNext()
/// <summary>
/// 다음으로 이동하기
/// </summary>
public void MoveNext()
{
try
{
TaskAwaiter<string> taskAwaiter;
switch(State)
{
case 0 :
taskAwaiter = this.taskAwaiter;
this.taskAwaiter = new TaskAwaiter<string>();
State = -1;
break;
default:
this.currentTime = DateTime.Now.ToString();
taskAwaiter = Program.GetTextAsync().GetAwaiter();
if(taskAwaiter.IsCompleted == false)
{
State = 0;
this.taskAwaiter = taskAwaiter;
CallAsyncStateMachine callAsyncStateMachine = this;
Builder.AwaitUnsafeOnCompleted(ref taskAwaiter, ref callAsyncStateMachine);
return;
}
break;
}
this.text = taskAwaiter.GetResult();
Console.WriteLine(this.currentTime + " : " + this.text);
}
catch(Exception exception)
{
State = -2;
Builder.SetException(exception);
return;
}
State = -2;
Builder.SetResult();
}
#endregion
#region (IAsyncStateMachine) 상태 머신 설정하기 - SetStateMachine(stateMachine)
/// <summary>
/// 상태 머신 설정하기
/// </summary>
/// <param name="asyncStateMachine">비동기 상태 머신</param>
public void SetStateMachine(IAsyncStateMachine asyncStateMachine)
{
}
#endregion
}
}
300x250
▶ Program.cs
using System;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
namespace TestProject
{
/// <summary>
/// 프로그램
/// </summary>
public class Program
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 프로그램 시작하기 - Main()
/// <summary>
/// 프로그램 시작하기
/// </summary>
private static void Main()
{
Console.Title = "IAsyncStateMachine 인터페이스 : 비동기 처리하기";
Program program = new Program();
Task task = program.CallAsync();
task.GetAwaiter().GetResult();
}
#endregion
#region 비동기 텍스트 구하기 - GetStringAsync()
/// <summary>
/// 비동기 텍스트 구하기
/// </summary>
/// <returns>문자열 태스크</returns>
public Task<string> GetTextAsync()
{
GetTextAsyncStateMachine asyncStateMachine = new GetTextAsyncStateMachine
{
Program = this,
Builder = AsyncTaskMethodBuilder<string>.Create(),
State = -1
};
asyncStateMachine.Builder.Start(ref asyncStateMachine);
return asyncStateMachine.Builder.Task;
}
#endregion
#region 비동기 호출하기 - CallAsync()
/// <summary>
/// 비동기 호출하기
/// </summary>
/// <returns>태스크</returns>
public Task CallAsync()
{
CallAsyncStateMachine asyncStateMachine = new CallAsyncStateMachine
{
Program = this,
Builder = AsyncTaskMethodBuilder.Create(),
State = -1
};
asyncStateMachine.Builder.Start(ref asyncStateMachine);
return asyncStateMachine.Builder.Task;
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > Common' 카테고리의 다른 글
[C#/COMMON] IMessageFilter 인터페이스 : WM_INPUT 메시지 처리하기 (0) | 2019.08.02 |
---|---|
[C#/COMMON] 지정한 타입의 항목을 갖는 제네릭 리스트 구하기 (0) | 2019.08.01 |
[C#/COMMON] SetConsoleCtrlHandler API 함수를 사용해 콘솔 프로그램 CTRL+C 키 입력시 처리하기 (0) | 2019.08.01 |
[C#/COMMON] 커스텀 태스크 사용하기 (0) | 2019.08.01 |
[C#/COMMON] 커스텀 태스크 사용하기 (0) | 2019.08.01 |
[C#/COMMON] IAsyncStateMachine 인터페이스 : 비동기 처리하기 (0) | 2019.07.31 |
[C#/COMMON] Environment 클래스 : Is64BitProcess 정적 속성을 사용해 64비트 프로세스 여부 구하기 (0) | 2019.07.31 |
[C#/COMMON] 파일 확장자와 연결된 실행 파일 경로 구하기 (0) | 2019.07.31 |
[C#/COMMON] 인증서 요청 코드 생성하기 (0) | 2019.07.30 |
[C#/COMMON] 마스터 부트 레코드(Master Boot Record, MBR) 조회하기 (0) | 2019.07.28 |
댓글을 달아 주세요