Tag: async await

只需停止异步方法即可

我有这种播放声音的方法,当用户点击屏幕时,我希望它在用户再次点击屏幕时停止播放。 但问题是“DoSomething()”方法不会停止,它会一直持续到完成。 bool keepdoing = true; private async void ScreenTap(object sender, System.Windows.Input.GestureEventArgs e) { keepdoing = !keepdoing; if (!playing) { DoSomething(); } } private async void DoSomething() { playing = true; for (int i = 0; keepdoing ; count++) { await doingsomething(text); } playing = false; } 任何帮助将不胜感激。 谢谢 :)

为什么Task.WaitAll()不会阻塞或导致死锁?

在下面的示例中,使用了两个await调用。 为了获得性能,样本转换为Task.WaitAll() (实际上没有更快,但这只是一个例子)。 这是来自Android上使用Sqlite.Net的库中的代码,该方法从主UI线程上的OnResume()调用: public async Task SetupDatabaseAsync() { await CreateTableAsync(); await CreateTableAsync(); } 这是替代方案: public void SetupDatabaseAsync() { var t1 = CreateTableAsync(); var t2 = CreateTableAsync(); Task.WaitAll(t1, t2); } 但是根据我的理解, Task.WaitAll()应该在等待时阻止UI线程,从而导致死锁。 但它的工作正常。 那是因为这两个调用实际上并没有在UI线程上调用任何东西吗? 如果我使用Task.WhenAll()而不是有什么区别? 我猜它即使调用UI线程也能工作,就像await 。

使用异步等待实现具有同步和异步API的库以实现相同的function

我有一些关于如何在库中提供相同function的同步和异步实现的问题。 我先问他们然后提供下面的示例代码(实际上相当多,但事实上它很简单)。 有没有办法避免违反DRY原则? 考虑JsonStreamReader.Read , JsonStreamWriter.Write , JsonStreamWriter.Flush , ProtocolMessenger.Send , ProtocolMessenger.Receive及其异步版本的实现。 在对同一方法的同步和异步版本进行unit testing时,是否存在避免违反DRY原则的方法? 我正在使用NUnit,虽然我猜所有框架在这方面应该是相同的。 应该如何实现一个返回Task或Task考虑ComplexClass.Send和ComplexClass.Receive的Take 1和Take 2变体? 哪一个是正确的,为什么? 考虑到不知道库将在何处使用(控制台应用程序,Windows窗体,WPF,ASP.NET),在库中await之后总是包含.ConfigureAwait(false)是否正确? 以下是我在第一个问题中提到的代码。 IWriter和JsonStreamWriter : public interface IWriter { void Write(object obj); Task WriteAsync(object obj); void Flush(); Task FlushAsync(); } public class JsonStreamWriter : IWriter { private readonly Stream _stream; public JsonStreamWriter(Stream stream) { _stream = stream; […]

使用Task.WaitAll()来处理等待的任务?

理想情况下,我想要做的是使用非阻塞模式延迟任务,然后等待所有任务完成。 我试图添加Task.Delay返回的任务对象然后使用Task.WaitAll但似乎这没有用。 我该如何解决这个问题? class Program { public static async void Foo(int num) { Console.WriteLine(“Thread {0} – Start {1}”, Thread.CurrentThread.ManagedThreadId, num); var newTask = Task.Delay(1000); TaskList.Add(newTask); await newTask; Console.WriteLine(“Thread {0} – End {1}”, Thread.CurrentThread.ManagedThreadId, num); } public static List TaskList = new List(); public static void Main(string[] args) { for (int i = 0; i Foo(idx))); […]

是否可以在按钮单击期间等待异步任务?

我的应用程序中有一个刷新按钮,它使用一些异步方法来更新显示的项目列表。 问题是我不能为按钮单击的事件处理程序提供返回类型的任务,所以我留下了一个异步void方法。 因此,用户可以点击刷新按钮,然后在重新填充列表时选择项目,这将导致错误。 处理按钮点击的代码的开头: private async void Button_Click_1(object sender, RoutedEventArgs e) { await ViewModel.CreateMessageCommand(); 那么无论如何要正确等待这项任务完成?

使用await与异步数据库调用有什么好处

我只是看看默认的MVC5项目以及它如何在控制器中使用async。 我想知道async在简单地使用同步调用时提供了什么好处: [HttpPost] [ValidateAntiForgeryToken] public async Task Disassociate(string loginProvider, string providerKey) { ManageMessageId? message = null; //why use an async database call here with await instead of just using a synchronous one? IdentityResult result = await UserManager.RemoveLoginAsync(User.Identity.GetUserId(), new UserLoginInfo(loginProvider, providerKey)); if (result.Succeeded) { message = ManageMessageId.RemoveLoginSuccess; } else { message = ManageMessageId.Error; } return RedirectToAction(“Manage”, […]

向标头添加授权

我有以下代码: … AuthenticationHeaderValue authHeaders = new AuthenticationHeaderValue(“OAuth2”, Contract.AccessToken); string result = await PostRequest.AuthenticatedGetData(fullUrl, null, authHeaders); return result; … public static async Task AuthenticatedGetData(string url, FormUrlEncodedContent data, AuthenticationHeaderValue authValue) { HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(authValue.Parameter); HttpResponseMessage response = await client.PostAsync(new Uri(url), data); response.Content.Headers.ContentType = new MediaTypeHeaderValue(“application/json”); response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync(); […]

线程的等待/异步有多么不同?

我正在尝试熟悉c#的新await / async关键字,我发现了几个我无法理解的方面。 让我们从竞争条件开始: Stream s=… … for(int i=0;i<100;i++) { s.WriteAsync(new byte[]{i},0,1); } 这将按预期工作(例如写入文件12345 …..而不是13254或其他东西)? 第二件事是异步函数如果不包含await运算符则同步执行。 而且,根据microsoft文档,异步函数总是在调用者线程中执行(与BeginInvoke相比)。 这带来了3个下一个问题: 异步函数在释放给调用函数之前执行了多少? async void MyAsyncFunction() { Operation1(); Operation2(); Operation3(); …. Stream s=…; await s.WriteAsync(….); } 在我读过的关于await / async的文章中,有人说没有等待操作符的异步函数按顺序执行,并且async / await立即返回。 但是我在唠叨MyAsyncFunction可能总是在释放之前执行Operation1 … Operation3,因为它命中了await s.WriteAsync 。 如果我在异步函数中使用Thread.Sleep ,如下所示: async void DoStuff() { Stream s=…; … await s.WriteAsync(….); Thread.Sleep(10000); …. […]

将事件转换为异步调用

我正在包装一个供我自己使用的库。 要获得某种财产,我需要等待一个事件。 我正在尝试将其包装成异步调用。 基本上,我想转 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 […]

async-await如何阻止?

我认为异步方法对IO工作有好处,因为它们在等待时不会阻塞线程,但这实际上是如何实现的呢? 我假设必须要听某些事情来触发任务才能完成,这是否意味着阻塞只是移动到其他地方?