首页 / C# / c#-Web应用程序中的异步等待性能
c#-Web应用程序中的异步等待性能
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-Web应用程序中的异步等待性能,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3009字,纯文字阅读大概需要5分钟。
内容图文
![c#-Web应用程序中的异步等待性能](/upload/InfoBanner/zyjiaocheng/662/fbb4eb57e7844a72821e3228c4149b8e.jpg)
到目前为止,我认为我已经掌握了异步等待如何使您的应用程序更具响应性的概念,但是我挂了两点:
图层注意事项
为了获得性能上的好处,异步等待是否必须一直从存储库层一直到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上找到很多信息,这是有好处的,而在这一特定方面上却一无所获.
解决方法:
要从async / await范例中获得任何好处,您将希望将其带到顶部,无论是MVC / Web API操作(通过将操作标记为异步并返回某种Task)还是在您的Web窗体方法(通常将它们标记为异步void,并在页面本身上设置Async属性).
除此之外,您只有两种选择:
>调用Task.Wait(),它确实会阻塞,因此您不会获得任何异步行为.
>通过不以任何方式不加入该线程来让它浮动,这可能不理想(即使对于诸如日志之类的不返回任何内容的IIS线程池系统,它也不喜欢浮动线程,因此请避免使用在这里使用).
综上所述,您提到如果这样做的话,另一个用户可以调用您的Web服务器,但这是正确的,但是要注意,ASP Web应用程序始终是“异步的”,因为它们有许多可用的线程.原则上,实现async / await是一个好主意,它有助于提高那些分配的线程的效率,并可能增加可用的并发连接的数量,但是不需要(例如)允许一次满足两个并发请求.线程池将自行处理.
如果您担心遍历整个代码库并与… Async()对应对象交换同步调用,请记住,您不必一次执行所有操作.如果可以的话,这是一个好习惯,因为异步调用具有前面列出的一些优点,但是请记住,您可以将return方法设置为返回Task.FromResult(object)以支持异步协定.
显然,这不是异步的,但是在迁移现有代码或编写库时要牢记一点,因为时间只会使越来越多的东西实现该模式,因此您可以设计成现在就欢迎它比希望您以后再做.
内容总结
以上是互联网集市为您收集整理的c#-Web应用程序中的异步等待性能全部内容,希望文章能够帮你解决c#-Web应用程序中的异步等待性能所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。