草庐IT

Async-await

全部标签

c# - 如果我在未定义为任务的 IQueryable 上使用 await + ToListAsync() 是否正确

我正在使用带有EF-6的asp.netMVC-5,我不确定使用await+ToListAsync是否有效。例如,我有以下返回IQueryable的存储库方法:-publicIQueryablegetAllScanEmailTo(){returnt.TSets.Where(a=>a.Name.StartsWith("ScanEmail"));}我这样调用它:-varemailsTo=awaitrepository.getAllScanEmailTo().ToListAsync();一开始,我以为我会得到一个错误,因为我正在使用“等待”一个未定义为任务的方法,但上面的方法运行良好,所以有人

C# 5 async/await 线程机制感觉不对?

为什么调用线程要进入异步方法直到内部'await'?调用异步方法后立即生成一个线程不是更干净吗?这样您就可以确定异步方法会立即返回。您不必担心在异步方法的早期阶段没有做任何昂贵的事情。我倾向于知道一个方法是否会在“我的”线程上执行代码。不管堵不堵。该模型似乎开启了一系列介于两者之间的可能性。设计师比我聪明得多,所以我确信这是有充分理由的,我只是想好好想想。 最佳答案 Isn'titcleanertojustspawnathreadassoonasanasyncmethodiscalled.“异步”方法的全部意义在于避免生成新线程。您

c# - 从 MSTest Runner 或控制台应用程序的调试器下使用 PortableClassLibrary 类中的 ConfiguredTaskAwaitable 有什么问题?

注意:这只是一个调试时错误,但却是一个非常奇怪的错误。问题:在附加调试器的情况下运行并调用方法时,暴露在单独的可移植库中,返回ConfiguredTaskAwaitable,我们得到InvalidProgramException.重现它:有2个项目:PortableClassLibrary(支持.Net4.5;Windows应用商店;WindowsPhone8)有1个类:publicclassWeird{publicstaticConfiguredTaskAwaitableGetConfiguredTaskAwaitable(){returnnewConfiguredTaskAwait

c# - 在异步方法中显示错误消息的更好方法

事实上我们不能使用awaitcatch中的关键字block使得在WinRT中显示来自异步方法的错误消息非常尴尬,因为MessageDialogAPI是异步的。理想情况下,我希望能够这样写:privateasyncTaskDoSomethingAsync(){try{//Somecodethatcanthrowanexception...}catch(Exceptionex){vardialog=newMessageDialog("Somethingwentwrong!");awaitdialog.ShowAsync();}}但是我必须这样写:privateasyncTaskDoSome

c# - 取消SemaphoreSlim.WaitAsync保持信号量锁

在我们的一个类(class)中,我们大量使用SemaphoreSlim.WaitAsync(CancellationToken)并取消它。当对WaitAsync的挂起调用在调用SemaphoreSlim.Release()后不久被取消时,我似乎遇到了问题(很快,我的意思是在ThreadPool有机会处理排队的项目之前),它将信号量置于无法获取进一步锁定的状态。由于ThreadPool项是否在调用Release()和Cancel()之间执行的不确定性,以下示例并不总能说明问题,对于那些情况,我已明确表示要忽略该运行。这是我试图证明问题的例子:voidMain(){for(vari=0;i

c# - 使用 async/await 时如何更好地处理已处置的控件

考虑在UI线程上运行的这段代码:dividends=awaitDatabase.GetDividends();if(IsDisposed)return;//DoexpensiveUIworkhereearnings=awaitDatabase.GetEarnings();if(IsDisposed)return;//DoexpensiveUIworkhere//etc...注意每次我await我也查了IsDisposed.这是必要的,因为说我await长期运行Task.同时,用户在完成之前关闭表单。Task将完成并运行尝试访问已处理表单上的控件的延续。发生异常。有没有更好的方法来处理这

c# - 测试显示 "await"明显更慢,即使等待的对象已经完成

我想通过使用await/async来测试程序的开销。为了对此进行测试,我编写了以下测试类:publicclassEntity:INotifyCompletion{privateActioncontinuation;privateinti;publicvoidOnCompleted(Actioncontinuation){this.continuation=continuation;}publicEntityGetAwaiter(){returnthis;}publicEntityGetResult(){returnthis;}publicboolIsCompleted{get{retu

c# - 如何连接异步枚举?

我有一个具有此返回类型的方法:publicasyncTask>GetAll()它进行了一些进一步的异步调用(未知数量),每个调用返回一个可枚举T的任务,然后想要连接结果以返回。vardata1=src1.GetAll();vardata2=src2.GetAll();vardata3=src3.GetAll();//andsoon现在很容易等待所有结果并连接结果以生成单个可枚举项,但我希望在第一次调用返回后立即使用可枚举项,如果有任何调用,则可能会等待调用者/枚举器当可用结果用完时仍然悬而未决。我是否必须为此手动滚动一个concat,以解决当它包装在任务中时缺少枚举器支持的问题?或者在

c# - 使用 OWIN 和异步方法的多语言网站

背景我正在使用ASP.NET4.6、C#、IIS上的OWIN管道(Microsoft.Owin.Host.SystemWeb)创建一个简单的多语言网站,大量异步方法调用和标准、全局资源文件(App_GlobalResources中的*.resx)。该网站使用MVC5、WebAPI2和Autofac作为依赖解析器。问题我无法正确更改生成页面的语言环境/区域性,因为异步方法对每个请求使用多个线程,而且我找不到设置Thread.Current[UI]Culture与给定请求关联的每个线程,因为这些属性不同步。我还希望保持干净的代码,不要让“异步/等待文化配置”弄乱有用的代码。代码启动.csp

c# - Task.ContinueWith 是否捕获调用线程上下文以继续?

下面的Test_Click是在UI线程上运行的代码的简化版本(带有WindowsFormsSynchronizationContext):voidTest_Click(objectsender,EventArgse){vartask=DoNavigationAsync();task.ContinueWith((t)=>{MessageBox.Show("Navigationdone!");},TaskScheduler.FromCurrentSynchronizationContext());}我是否应该显式指定TaskScheduler.FromCurrentSynchronizat