2014-06-18 4 views
0

가능한 경우이 작업을 수행하려면 2 개의 병렬 작업이 있어야하는 MVC 컨트롤러 작업 메서드 (POST)가 있고 그 중 하나를 완료하면 결과를 기반으로 뷰를 반환해야합니다. 완료된 작업.Asp.net MVC 컨트롤이 2 비동기 작업을 수행합니다

작업은 비동기 옵션이있는 웹 서비스가 아닙니다. 파일 묶음을 만드는 것보다 더 많이한다고 가정합니다. 나는 정말로이 일처럼 단순한 일을하고 싶다.

private static string DoStuff(int sleepTime, string input) 
{ 
     Thread.Sleep(sleepTime); 
     return input; 
} 

작업 같은 것 -하지만이 올바른지 또는 없기 때문에하지 좀 더 자세한 정보가 필요하면

public async Task<string> DelayTimerCallAsync() 
{ 

    string msgs = DoStuff(Convert.ToInt32(
          ConfigurationManager.AppSettings["DelayTimer"]), 
          "Timeout"); 
    return msgs; 
} 

내 질문이 명확하지 않은 경우 알려줘 또는 '기다린다'만약 내가 해달라고 . 갱신 아래에서

제 2 개 작업이

public Task<String> DelayTimerCallAsync(CancellationToken cancellationToken) 
{ 
    return Task.Run(() => 
    { 
     String messages = null; 
     return DelayTimer(); 
    }, cancellationToken); 
} 

public Task<String> BlazeCallAsync(CancellationToken cancellationToken) 
{ 
    return Task.Run(() => 
    { 
     String messages = null; 
     return BlazeCall(); 
    }, cancellationToken); 
} 

어떻게 그들에게 전화하고 Task.WhenAny(task1, task2)을 사용할 수 있습니다처럼?

+1

이전에도이 질문을하지 않았습니까? –

+0

다소 불분명하지만,'async' /'task '을 사용하지 않으면 작업의 요점을 놓칠 수 있습니다. 인라인을 유지하거나 스레드를 사용할 수도 있습니다. –

+0

@ AD.net. 나는이 질문을하기 전에 물어 보았다. 그리고 대답을 얻지 못했다. 나는 그것을 더 분명하게하려고 노력했다. – Praneeth

답변

1

내가이 질문을 이해하는지 모르겠지만, 나는 그것에 찔러 보겠다.

public Task<String> DelayTimerCallAsync(CancellationToken cancellationToken) 
{ 
    return Task.Run(() => { 
    String messages = null; 
    /* do work here (assign messages a value) */ 
    return messages; 
    }, cancellationToken); 
} 

당신이 경우 : 당신이 다음과 같은 종류의 볼 것, 할 수있는 "일"이 (즉, 일반적으로 동 기적으로 실행됩니다)하지만 비동기 방식으로 그것을 포장하고 싶은 가정

반대로 (Task 동 기적으로 실행하면) 쉽게 그렇게 할 수 있습니다. 돕기 위해 여기에 일을 좀 더 쉽게 만드는 간단한 클래스는 다음과 같습니다

public static class AsyncHelper 
{ 
    private static readonly TaskFactory taskFactory = new TaskFactory(CancellationToken.None, TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Default); 

    public static void RunSync(Func<Task> func) 
    { 
     taskFactory 
      .StartNew<Task>(func) 
      .Unwrap() 
      .GetAwaiter() 
      .GetResult(); 
    } 

    public static TResult RunSync<TResult>(Func<Task<TResult>> func) 
    { 
     return taskFactory 
      .StartNew<Task<TResult>>(func) 
      .Unwrap<TResult>() 
      .GetAwaiter() 
      .GetResult(); 
    } 
} 

당신은 다음 await없이 Task 방법을 실행할 수있는 능력을 가지고있다. 다음과 같이 입력하십시오 :

// (referencing DelayTimeCallAsync above: 
String messages = AsynHelper.RunSync(DelayTimeCallAsync(CancellationToken.None)); 
+0

첫 번째 것은 내가 찾고있는 것입니다. 하지만 난 메인 클래스에서 시작하고 둘 중 하나의 완료로 돌아갈 것입니다 2 작업을해야합니다 ... 마찬가지로 Task.WhenAny (task1, task2) – Praneeth