Tag: asynchronous

无法理解异步并等待

我一直在尝试理解as#/ await和C#中的任务,但是尽管观看了YouTubevideo,阅读文档和遵循复数课程,但仍然失败了。 我希望有人能够帮助回答这些略微抽象的问题,以帮助我的大脑。 1.为什么他们说async / await在它自己的async关键字什么都不做而且await关键字添加一个暂停点时启用’asynchonrous’方法? 没有添加一个暂停点,强制该方法同步动作,即在继续之前完成await标记的任务。 2.显然除了事件处理程序之外你不应该使用async void,那么你如何正常调用异步方法呢? 似乎为了使用await关键字调用异步方法,调用它本身的方法/类需要标记为async。 我见过的所有例子都“启动”了一个带有事件处理程序的异步void方法。 你将如何“逃避”async / await的包装以运行该方法? 3。 public async Task SaveScreenshot(string filename, IWebDriver driver) { var screenshot = driver.TakeScreenshot(); await Task.Run(() => { Thread.Sleep(2000); screenshot.SaveAsFile(filename, ScreenshotImageFormat.Bmp); Console.WriteLine(“Screenshot saved”); }); Console.WriteLine(“End of method”); } 回到1.这看起来像一个同步方法。 当它到达Task.Run时执行暂停,因此Console.WriteLine(“End of method”); 在任务完成之前不会执行。 也许整个方法本身将在代码中触发它时异步执行? 但回到2,你需要等待调用它,否则你得到消息’因为没有等待这个调用..’因此添加await将导致该执行点同步等等。 任何帮助理解这一点将非常感激。

异步/等待执行差异

我正在努力掌握异步/等待,我想澄清一些混乱。 有人可以解释以下执行方面的差异: // version 1 public Task Copy(string source, string destination) { return Task.Run(() => File.Copy(source, destination)); } public async Task Test() { await Copy(“test”, “test2”); // do other stuff } 和: // version 2 public async Task Copy(string source, string destination) { await Task.Run(() => File.Copy(source, destination)); } public async Task Test() { await […]

异步友好的DispatcherTimer包装器/子类

我在我的代码中运行一个DispatcherTimer ,每30秒触发一次,从服务器更新系统状态。 即使我正在调试我的服务器代码,计时器也会在客户端中触发,所以如果我已经调试了5分钟,我可能会在客户端中进行十几次超时。 最后决定我需要解决这个问题,以便制作一个更加async / await友好的DispatcherTimer。 在DispatcherTimer运行的代码必须是可配置的,无论它是否是可重入的(即,如果任务已在运行,则不应尝试再次运行它) 应该是基于任务的(这是否需要我实际上在根处公开Task是一个灰色区域) 应该能够运行异步代码并await任务完成 无论是包装还是扩展DispatcherTimer可能并不重要,但如果您不知道如何使用它,包装它可能会稍微不那么模糊 可能为UI的IsRunning公开可绑定属性

将事件转换为异步调用

我正在包装一个供我自己使用的库。 要获得某种财产,我需要等待一个事件。 我正在尝试将其包装成异步调用。 基本上,我想转 void Prepare() { foo = new Foo(); foo.Initialized += OnFooInit; foo.Start(); } string Bar { return foo.Bar; // Only available after OnFooInit has been called. } 进入这个 async string GetBarAsync() { foo = new Foo(); foo.Initialized += OnFooInit; foo.Start(); // Wait for OnFooInit to be called and run, but don’t know […]

异步/等待作为协同程序的替代品

我使用C#迭代器作为协同程序的替代品,它一直很好用。 我想切换到async / await,因为我认为语法更清晰,它给了我类型安全。 在这篇(过时的)博客文章中,Jon Skeet展示了实现它的可能方法 。 我选择采用稍微不同的方式(通过实现我自己的SynchronizationContext并使用Task.Yield )。 这很好用。 然后我意识到会有问题; 目前协程不必完成运行。 它可以在任何产生的点上优雅地停止。 我们可能有这样的代码: private IEnumerator Sleep(int milliseconds) { Stopwatch timer = Stopwatch.StartNew(); do { yield return null; } while (timer.ElapsedMilliseconds < milliseconds); } private IEnumerator CoroutineMain() { try { // Do something that runs over several frames yield return Coroutine.Sleep(5000); } finally { Log("Coroutine […]

使用Task.Run调用异步方法似乎错了?

我最近遇到了这个由我们为我们工作的承包商编写的代码。 它要么是非常聪明或愚蠢(我认为后者,但我想要第二个意见)。 我不是在await async速度。 基本上它的工作方式如下: public bool Send(TemplatedMessageDto message) { return Task.Run(() => SendAsync(message)) .GetAwaiter() .GetResult(); } public async Task SendAsync(TemplatedMessageDto message) { //code doing stuff var results = await _externalresource.DothingsExternally(); //code doing stuff } 现在据我所知,第一个Task.Run()是没有意义且效率低下的? 应该是: public bool Send(TemplatedMessageDto message) { return SendAsync(message)) .GetAwaiter() .GetResult(); } public async Task SendAsync(TemplatedMessageDto message) { //code doing […]

使用线程池而不是异步IO的HttpClient.SendAsync?

所以我一直在通过Reflector挖掘HttpClient.SendAsync的实现。 我有意想知道的是这些方法的执行流程,以及确定调用哪个API来执行异步IO工作。 在探索了HttpClient的各种类之后,我在内部看到它使用HttpClientHandler ,它派生自HttpMessageHandler并实现其SendAsync方法。 这是HttpClientHandler.SendAsync的实现: protected internal override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (request == null) { throw new ArgumentNullException(“request”, SR.net_http_handler_norequest); } this.CheckDisposed(); this.SetOperationStarted(); TaskCompletionSource source = new TaskCompletionSource(); RequestState state = new RequestState { tcs = source, cancellationToken = cancellationToken, requestMessage = request }; try { HttpWebRequest request2 = this.CreateAndPrepareWebRequest(request); state.webRequest = […]

没有EndInvoke的C#异步调用?

以下面的课程为例。 public class A { // … void Foo(S myStruct){…} } public class B { public A test; // … void Bar() { S myStruct = new S(); test.Foo(myStruct); } } 现在,我希望方法调用test.Foo(myStruct)是一个异步调用(’fire-and-forget’)。 条形方法需要尽快返回。 代理,BeginInvoke,EndInvoke,ThreadPool等文档不能帮助我找到解决方案。 这是有效的解决方案吗? // Is using the `EndInvoke` method as the callback delegate valid? foo.BeginInvoke(myStruct, foo.EndInvoke, null);

超时使用TaskCompletionSource实现的异步方法

我有一个blackbox对象,它暴露了一个异步操作的方法,并在操作完成时触发一个事件。 我已经使用TaskCompletionSource将其包装到Task BlackBoxOperationAysnc()方法中 – 效果很好。 但是,在那个异步包装器中,如果在给定的超时后没有收到事件,我想管理用超时错误完成异步调用。 目前我使用计时器管理它: public Task BlackBoxOperationAysnc() { var tcs = new TaskCompletionSource(); const int timeoutMs = 20000; Timer timer = new Timer(_ => tcs.TrySetResult(OpResult.Timeout), null, timeoutMs, Timeout.Infinite); EventHandler eventHandler = (sender, args) => { … tcs.TrySetResult(OpResult.BlarBlar); } blackBox.EndAsyncOpEvent += eventHandler; blackBox.StartAsyncOp(); return tcs.Task; } 这是管理超时的唯一方法吗? 有没有设置我自己的计时器 – 我看不到TaskCompletionSource内置的任何超时?

异步CTP – 如何使用async / await来调用wcf服务?

如果我调用WCF服务方法,我会这样做: proxy.DoSomethingAsync(); proxy.DoSomethingAsyncCompleted += OnDoSomethingAsyncCompleted; 我怎么能使用新的async ctp做同样的事情? 我想我需要像proxy.DoSomethingTaskAsync或proxy.DoSomethingAsync().ToTask() ? Web服务调用需要返回一个Task才能使用await关键字,但是如何?