c# – 阻止任务中的方法
我目前正在开发一个小型服务器应用程序,并掌握Task<>以及其他相关操作.
我想知道Blocking操作在Task中是如何工作的. 因此,例如,我目前使用几个具有“阻塞”操作的库.其中之一是Npgsql(PostgreSQL提供商.) 如果我做以下…… Task myTask = new Task<>( () => { using(var db = new PostgresqlDatabaseConnection()) { db.ExecuteQuery("SELECT takes 50 ms to get data...") db.Insert(anObject); etc.... } } ).Start(); 并且说,将它链接到处理该数据的许多其他任务. 这有效吗? I.E.假设ExexuteQuery调用某种Thread.Sleep(1)或以某种方式阻塞线程,这是否会影响我的任务执行? 我问,因为我的服务器使用了几个必须重写的库来容纳一个完全异步的方法.或者这个Async足够吗? *我的想法 * 我真的不确定. 我知道,如果db.Executre()只运行了一个while(true)循环,直到它获得了它的数据,它几乎肯定会阻塞我的服务器.因为很多时候会花费处理(真实).或者Task是否足够聪明,知道它应该花更少的时间在这上面?或者,如果内部使用一些等待机制,那么Task库是否知道?是否知道应该在等待时处理其他任务. 解决方法
使用C#5的async / await功能肯定会让事情变得更容易.它可以使异步代码更容易编写,因为你编写的代码非常类似于编写同步代码的方式.
以下面的例子为例.我正在使用Thread.Sleep来模拟长时间运行的操作,因此任何本机不支持异步的库仍然可以通过Task.Run使用.当Thread.Sleep阻止线程时,您的UI仍然响应.如果您已同步编写此代码,则UI将保持1.5秒,直到thread.sleep完成. private async void button1_Click(object sender,EventArgs e) { Console.WriteLine("0"); await DoWorkAsync(); Console.WriteLine("3"); } private async Task DoWorkAsync() { Console.WriteLine("1"); await Task.Run(()=> { // Do your db work here. Thread.Sleep(1500); }); Console.WriteLine("2"); } 简而言之,如果您有长时间运行的数据库操作并且希望保持UI响应,则应该利用async / await.虽然这确实可以保持您的UI响应,但它确实带来了新的挑战:如果用户多次单击按钮会发生什么,或者如果用户在处理命名某些简单情况时关闭窗口会发生什么. 我鼓励你进一步阅读这个主题. Jon Skeet在异步上有一个multi-part series.关于这个问题还有许多MSDN文章:1 2 3 … (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |