草庐IT

Async-await

全部标签

c# - 不允许异步锁

基本上,我想向tcp服务器发出多个异步请求。我目前有一个工作客户端,它只同步并在每次网络调用时阻止UI。由于几乎同时发生多个请求,我尝试这样做:privateobjectreadonlyreadLock=newobject();publicasyncTaskUpdateDetailsAsync(){//Iwanteveryrequesttowaittheirturnbeforerequesting(usingtheconnection)//topreventareadcallfromcatchinganydatafromanotherrequestlock(readLock){Deta

c# - 我应该在每个等待的操作上调用 ConfigureAwait(false)

我读了这篇文章https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html-但是我看到了一个矛盾:我知道UI线程死锁的问题,因为UI线程阻塞等待异步操作完成,但相同的异步操作同步到UI线程上下文-因此异步操作无法进入UI线程,因此UI线程不会停止等待。文章告诉我们解决方法是不要在UI线程上阻塞,否则您需要使用ConfigureAwait(false)everywhere:Youwouldhavetouseforeveryawaitinthetransitiveclosureofallmethodscalledb

c# - CancellationToken.ThrowIfCancellationRequested 后的故障与取消任务状态

通常我不会发布带有答案的问题,但这次我想引起一些人对我认为可能是一个晦涩但普遍的问题的关注。它是由thisquestion触发的,从那以后我检查了我自己的旧代码,发现其中一些也受此影响。下面的代码启动并等待两个任务,task1和task2,它们几乎相同。task1与task2的唯一区别在于它运行一个永无止境的循环。IMO,这两种情况对于一些执行CPU密集型工作的现实场景来说都是非常典型的。usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;namespaceConsoleApplication{publicclas

c# - 一路异步?

在尝试理解新的异步/等待模式时,我有一个问题找不到答案,即我是否应该用异步装饰我的方法,如果我打算从其他异步函数调用这些方法,或者只需返回Task在什么地方合适?换句话说,A、B或C类中哪一个最好,为什么?classA{publicasyncTaskfoo1()//Shouldbeconsumed{returnawaitfoo2();}publicasyncTaskfoo2()//Couldbeconsumed{returnawaitfoo3();}privateasyncTaskfoo3()//Private{returnawaitTask.Run(...);}}classB{pub

c# - 异步显示对话框

我正在使用async/await从数据库异步加载我的数据,在加载过程中,我想弹出一个加载表单,它只是一个带有运行进度条的简单表单,表明有一个正在运行的进程。加载数据后,对话框将自动关闭。我怎样才能做到这一点?以下是我当前的代码:protectedasyncvoidLoadData(){ProgressForm_progress=newProgressForm();_progress.ShowDialog()//notworkingvardata=awaitGetData();_progress.Close();}更新:我设法通过更改代码让它工作:protectedasyncvoidLo

C#有异步函数调用同步函数或者同步函数调用异步函数

我正在编写一个C#.Net4.5库来执行常见的sql数据库操作(备份、恢复、执行脚本等)。我希望每个操作都有同步和异步功能,因为这个库将被控制台和GUI应用程序使用,但我不想在任何地方重复代码。所以在我看来,我有两个选择:在同步函数中编写完成工作的代码,然后将其包装在异步函数的任务中,如下所示:publicvoidBackupDB(stringserver,stringdb){//Doalloftheworkandlongrunningoperationhere}publicasyncTaskBackupDBAsync(stringserver,stringdb){awaitTask.

c# - IProgress<T> 多久报告一次进度

使用IProgress时报告进度,应该是代码报告进度的责任是将其进度报告的频率限制在“合理”的范围内,-或-具体执行责任IProgress请注意,进度报告的频率可能高于其呈现此进度的合理方式。问题的上下文是我有一些使用IProgress的代码报告进度,并且它以非常高的速度报告进度。我想用UI进度条显示进度。如果我使用提供的Progress实现(将进度发布到UISyncronizationContext),然后它会导致UI无响应(即发送到消息队列的消息太多,用户甚至无法单击对话框上的“取消”按钮)。所以,我可以通过减少报告来解决这个问题,但是如果我有一个IProgress怎么办?只是将进

c# - 带有 await 的异步 lambda 表达式返回任务?

我有以下代码://Getallofthefilesfromthelocalstoragedirectory.varfiles=awaitfolder.GetFilesAsync();//Mapeachfiletoastreamcorrespondingtothatfile.varstreams=files.Select(asyncf=>{returnawaitf.OpenStreamForWriteAsync();});我希望streams类型为IEnumerable但实际上是IEnumberable>,如果我省略了await关键字,这就是我所期望的。OpenStreamForWrit

c# - SmtpClient.SendMailAsync 在抛出特定异常时导致死锁

我正在尝试根据VS2013项目模板中的示例AccountController为ASP.NETMVC5网站设置电子邮件确认。我已经使用SmtpClient实现了IIdentityMessageService,尽量保持简单:publicclassEmailService:IIdentityMessageService{publicasyncTaskSendAsync(IdentityMessagemessage){using(varclient=newSmtpClient()){varmailMessage=newMailMessage("some.guy@company.com",mes

c# - MVC4 + async/await + 在 Action 完成前返回响应

在我的MVC4应用程序中,我需要添加一个Controller来上传和处理大文件。文件上传后,我需要立即开始对该文件的异步处理,并在不等待处理完成的情况下将响应返回给浏览器。显然我可以启动一个新线程来手动处理文件,但我想知道我是否可以使用.net4.5引入的异步/等待机制来实现这种情况为了测试这个概念,我尝试了这样的事情:publicasyncTaskTest(){TestAsync();returnView("Test");}publicasyncvoidTestAsync(){awaitLongRunning();}privateTaskLongRunning(){returnTas