>

다음 시나리오가 있습니다 :
명령이 입력되면 (테스트를 위해 콘솔 응용 프로그램, 준비가되면 WebService가되기를 바랍니다) 코드를 실행하고 추가 사용자 입력이 필요하면 명령 인터프리터로 즉시 돌아갑니다. 새로운 입력이 주어지면 처리를 다시 시작한 곳에서 다시 시작하고 싶습니다. 그것은 c # 5 async-await 패턴과 매우 흡사하여 시도해보기로 결정했습니다. 나는 이것에 대해 생각하고 있었다 :

public void CommandParser()
{
   while(true)
   { 
      string s = Console.ReadLine();
      if (s == "do_something")
         Execute();
      else if (s == "give_parameters")
         SetParameters();
      //... 
   }
}
MySettings input;
public async void Execute()
{
  //do stuff here
  MyResult result = null
  if (/*input needed*/){
     input = new MySetting();
     result = await input.Calculate();
  }
  else { /* fill result synchronously*/}
  //do something with result here
}
public void SetParameters()
{
   if (input!=null)
      input.UseThis("something"); //now it can return from await
}

이제 내 질문은 MySettings.Calculate 및 MySettings.UseThis를 작성하는 방법입니다. 첫 번째 작업을 반환하고 두 번째 작업을 준비하는 방법은 무엇입니까? Task에 대한 많은 팩토리 메소드로 시도했지만 올바른 것을 찾을 수 없습니다! 도와주세요!

  • 답변 # 1

    하나의 옵션은 TaskCompletionSource<T> 를 사용하는 것입니다 . 그것은 당신을위한 작업을 구축하고, 당신은 SetResult 를 호출 할 수 있습니다  또는 SetException  소스에서 작업을 적절하게 표시합니다.

    AsyncTaskMethodBuilder<T> 를 구현하는 데 사용한 것입니다.  Eduasync의 경우-예를 들어 살펴볼 수 있습니다.

    TaskCompletionSource 를 설정해야합니다.  사전에 또는 다른 조정을 수행하여 input.Calculate  그리고 UseThis  둘 다 같은 물체에 대해 알고 있지만 Calculate  그냥 completionSource.Task 를 반환합니다 및 UseThis   completionSource.SetResult 를 호출합니다 .

    SetResult 에 전화하면 , 비동기 응용 프로그램은 콘솔 응용 프로그램 (또는 웹 서비스)을 사용하는 경우 다른 스레드 풀 스레드에서 계속 진행되므로다른 TaskCompletionSource 를 만들고 싶을 것입니다.  메인 루프가 다음 라운드에서 사용되도록합니다.

  • 이전 forms - PHP를 사용하여 신용 카드 처리를 배우기위한 좋은 자습서 나 책은 무엇입니까?
  • 다음 python - wxPython 패널이있는 최소 크기의 프레임