Asp.net MVC Control执行2个异步任务

时间:2014-06-18 20:03:59

标签: asp.net-mvc c#-4.0 asynchronous task-parallel-library

我想检查这是否可能,我有一个MVC控制器动作方法(POST)应该有2个并行任务,完成其中一个应该根据已完成的任务的结果返回视图。

任务不是具有异步选项的aweb服务。假设它更像是创建一堆文件。我真的希望我的任务尽可能简单。

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 :(得分:1)

不确定我是否理解这个问题,但是我会对它进行一次尝试。

假设你有&#34;工作&#34;要做(通常会同步运行),但想在异步方法中包装它,它看起来有点像:

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();
    }
}

然后,您可以在没有Task的情况下执行await方法。类似的东西:

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