我想检查这是否可能,我有一个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)
?
答案 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));