草庐IT

Async-await

全部标签

c# - 如何实现异步 File.Delete/Create/Move?

由于我必须在我的应用程序中进行大量文件I/O操作,我决定异步实现它们。查看MSDN,没有File.Create、File.Delete和File.Move的异步副本。据我了解,原因是不存在用于文件删除、创建或移动的异步Win32实现,所以我最终得到以下解决方案:publicstaticTaskDeleteAsync(stringpath){Guard.FileExists(path);returnTask.Run(()=>File.Delete(path));}publicstaticTaskCreateAsync(stringpath){Guard.IsNotNullOrWhites

c# - Stream.ReadAsync 和 Stream.WriteAsync 是否应该在返回之前或操作完成之后同步更改光标位置?

我一直在尝试实现一个支持ReadAsync和WriteAsync的Stream,并考虑到documentation的冗余性,我正在努力了解如何正确执行此操作。具体来说,关于流的光标位置。问了一个类似的问题here和here关于旧的BeginRead函数。该函数的文档似乎表明,在任何挂起的异步操作完成之前,不应再次调用BeginRead。鉴于BeginRead现在已弃用nolongerrecommendedfornewdevelopment并且Stream可能已被显着改变以实现新的Async功能,事情再次不清楚。(编辑:通常这种警告意味着新函数被直接实现,旧函数调用新函数并且仍然存在只是

c# - 将 SynchronizationContext 设置为 null 而不是使用 ConfigureAwait(false)

我有一个公开方法的同步和异步版本的库,但在幕后,它们都必须调用异步方法。我无法控制该异步方法(它使用async/await并且不使用ConfigureAwait(false)),也无法替换它。代码在ASP.NET请求的上下文中执行,因此为了避免死锁,这是我所做的:varcapturedContext=SynchronizationContext.Current;try{//Wipethesynccontext,sothatthebadlibrarycodewon'tfindit//Thatway,weavoidthedeadlockSynchronizationContext.SetS

c# - 返回任务或等待和 ConfigureAwait(false)

假设有这样一个方法的服务库publicasyncTaskGetPersonAsync(Guidid){returnawaitGetFromDbAsync(id);}遵循SynchronizationContext的最佳实践更好用publicasyncTaskGetPersonAsync(Guidid){returnawaitGetFromDbAsync(id).ConfigureAwait(false);}但是当你只有一个操作时(我认为)最好直接返回任务。参见Attheendofanasyncmethod,shouldIreturnorawait?publicTaskGetPerson

c# - 如何在不关闭流的情况下取消 NetworkStream.ReadAsync

我正在尝试使用NetworkStream.ReadAsync()来读取数据,但我找不到如何在调用后取消ReadAsync()。对于背景,NetworkStream由连接的BluetoothClient对象(来自32Feet.NET蓝牙库)提供给我。我正在尝试的当前get-it-working代码如下。intbytesRead;while(this.continueReading){bytesRead=awaitthis.stream.ReadAsync(this.buffer,0,(int)this.buffer.Length);Console.WriteLine("Received{

c# - Using block 中的异步

我在C#中有以下异步函数:privateasyncTaskCallDatabaseAsync(Func>execAsync){using(varconnection=newSqlConnection(_connectionString)){connection.Open();returnawaitexecAsync(connection);}}它允许执行任何异步函数execAsync,该函数将SQL连接作为参数并使用它来进行数据库调用,方法是提供连接对象并确保其正确关闭。然后从WebApiController中的操作调用此函数,如下所示:publicasyncTaskMyAction(

c# - 如何避免使用 async void 事件处理程序重入?

在WPF应用程序中,我有一个通过网络接收消息的类。每当所述类的对象收到一条完整的消息时,就会引发一个事件。在应用程序的主窗口中,我有一个事件处理程序订阅了该事件。保证在应用程序的GUI线程上调用事件处理程序。无论何时调用事件处理程序,都需要将消息的内容应用于模型。这样做可能会非常昂贵(在当前硬件上>200ms)。这就是使用Task.Run将应用消息卸载到线程池的原因。现在,可以非常连续地接收消息,因此可以在仍在处理之前的更改时调用事件处理程序。确保一次只应用一条消息的最简单方法是什么?到目前为止,我已经得出以下结论:usingSystem;usingSystem.Threading.T

c# - 使用 async/await 限制信号量线程

我最近遇到了一个针对异步/等待调用限制线程的示例。在我的机器上分析和运行代码后,我想出了一种稍微不同的方法来做同样的事情。我不确定的是引擎盖下发生的事情是否几乎相同,或者是否有任何值得注意的细微差别?这是基于原始示例的代码:privatereadonlySemaphoreSlim_semaphore=newSemaphoreSlim(5);publicasyncTaskCallThrottledTasks(){vartasks=newList();for(intcount=1;count{try{intresult=awaitLongRunningTask();Debug.Print(

c# - 了解 TaskScheduler.Current 的行为

这是一个简单的WinForms应用程序:usingSystem;usingSystem.Diagnostics;usingSystem.Threading;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespaceWindowsFormsApplication{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privateasyncvoidbutton1_Click(objectsender,EventArgse){varts=Task

c# - 捕获从异步 lambda 抛出的异常

我正在尝试编写一个方法来尝试执行一个操作,但会吞下引发的任何异常。我的第一次尝试如下:publicstaticvoidSafeExecute(ActionactionThatMayThrowException){try{actionThatMayThrowException();}catch{//noop}}在使用同步操作调用时有效:SafeExecute(()=>{thrownewException();});但是当使用异步操作调用时失败:SafeExecute(async()=>{awaitTask.FromResult(0);thrownewException();});是否可以