【问题标题】:Asp.net MVC Control execute 2 async taskAsp.net MVC Control 执行 2 个异步任务
【发布时间】:2014-06-18 20:03:59
【问题描述】:

我想检查这是否可能,我有一个 MVC 控制器操作方法 (POST),它应该有 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;
}

如果我的问题不清楚或者您需要更多信息,请告诉我。

从下面更新我的两个任务是这样的

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)

【问题讨论】:

  • 你之前不是也问过这个问题吗?
  • 这有点不清楚,但据我所知,如果你不打算使用async/task&lt;t&gt;,你会错过任务的重点。不妨保持内联或使用线程。
  • @AD.net 我之前确实问过这个问题,但没有得到任何答案,我试图让它更清楚。
  • 这两个任务将是异步类型并返回一个字符串。诸如...查看我的问题已更新。
  • 所以你想在同步方法中运行异步方法(你不会有async/await)?

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


【解决方案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));

【讨论】:

  • 第一个是我要找的。但是我将有 2 个任务将从主类开始,并且它们中的任何一个的完成都应该返回......就像使用 Task.WhenAny(task1, task2)
猜你喜欢
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多