【发布时间】:2017-12-07 18:55:45
【问题描述】:
到目前为止,我想我已经掌握了异步等待如何使您的应用程序更具响应性的概念,但我坚持两点:
图层注意事项 异步等待是否必须从存储库层一直到 MVC 或 WCF 层才能获得性能优势,或者我可以只对需要很长时间的存储库方法执行异步操作吗?
“等待”用法如果我只能在存储库级别工作,那么有一部分我不明白。使用这种(低层)方法,线程是否能够在等待 io 绑定代码完成时为传入的客户端请求提供服务?
在我的脑海中,我整理了一个示例控制台应用程序,当长时间运行的任务仍在继续时,另一个用户可以向我的 Web 应用程序发出请求。使用我的小库(以简化集成和异常处理),他们的请求会由挂起的线程提供服务,还是voidTask.Wait(); 导致线程阻塞?
public class AsyncTest
{
public void RunTest()
{
try
{
using (var task = new RunTask(LongRunningTask))
{
Console.WriteLine("Echo two things:");
for (int i = 0; i < 2; i++)
{
var input = Console.ReadLine();
Console.WriteLine(string.Format("Echoing \"{0}\"", input));
}
}
}
catch (Exception e)
{
Console.WriteLine("Error, hm, what happened??");
Console.WriteLine();
Console.WriteLine(e.Message);
Console.WriteLine(e.StackTrace);
}
}
public void LongRunningTask()
{
var totals = 0;
for (int i = 0; i < 30; i++)
{
Thread.Sleep(1000);
totals += 5;
if (i == 25)
throw new ArgumentException("I can't handle this! Errorr!!@!@");
Console.WriteLine(string.Format("LongRunningTask Step {0}...", (i + 1)));
}
}
}
public class RunTask : IDisposable
{
public delegate void IOBoundOperations();
private Task voidTask;
public RunTask(IOBoundOperations task)
{
voidTask = Execute(task);
}
async public Task Execute(IOBoundOperations task)
{
await Task.Run(() =>
{
task();
});
}
public void Dispose()
{
try
{
voidTask.Wait();
}
catch
{
throw new AsyncException("Failed to run task asynchronously: " +
voidTask.Exception.InnerException.Message, voidTask.Exception.InnerException);
}
}
}
我等待,因为我需要它来执行将数据返回给它可能依赖的调用代码的任务。我也这样做了,因为我注意到在线程也执行完我的异步内容之前,该过程不会完成。
我可以找到很多关于 async/await 及其好处的信息,但在这一特定方面却一无所获。
【问题讨论】:
-
您发布的代码没有做任何真正的异步工作。它只是安排一个调用同步委托的长时间运行的任务。另请注意,在您的示例中,由于您的
RunTask类的Dispose方法中的voidTask.Wait使用了两次“回声”,UI 线程就会阻塞。我看不出该代码与您的问题有何关联。 -
是的,我试图让它异步运行,但是当应用程序运行时线程不会被强制结束。我的想法是,一个请求进来,我开始一个长时间运行的任务并继续。我不希望仅仅因为请求已完成服务而结束长时间运行的任务。这就是为什么我打电话给
wait。我与 Richter 一起观看了一段视频,他解释说没有必要保留 Task,但在控制台应用程序中,线程一旦完成就会停止执行。 -
我指的链接:channel9.msdn.com/Shows/AppFabric-tv/…(我知道的情况略有不同,这就是我首先在上面的代码中确认的原因。
标签: c# multithreading asynchronous