Tag: async await

如何将Async方法作为Action或Func传递

我有一个小实用工具方法,用于在using语句中实例化我的datacontext。 我想在异步方法调用中使用它,但是在方法返回之前处理datacontext。 使用它的正确方法是什么? 这是方法(和重载) public void Try(Action method) { using (IDataServices client = GetClient()) { method(client); } } public TResult Try(Func method) { using (IDataServices client = GetClient()) { return (TResult)method(client); } } 这是我当前使用它的方式(失败): Model m = await ClientResolver.Try(async x => await x.GetModelByIDAsync(modelID)); 参考: 在using语句中调用异步方法

例外:应用程序调用了为不同线程编组的接口

private void LogInButton_Click(object sender, RoutedEventArgs e) { var api = new RestAPI(“http://localhost:2624/”, UsernameTextBox.Text, PasswordTextBox.Password); api.AutenticarUsuarioFinalizado += (o, args) => { ProgressBar.IsIndeterminate = false; ProgressBar.Visibility = Visibility.Collapsed; LogInButton.IsEnabled = true; if (args.Error) return; if (args.Resultado.Autenticado) { } }; api.AutenticarUsuario(); ProgressBar.Visibility = Visibility.Visible; ProgressBar.IsIndeterminate = true; LogInButton.IsEnabled = false; } api.AutenticarUsuario(); 异步调用rest API,完成后调用事件处理程序api.AutenticarUsuarioFinalizado并在行ProgressBar.IsIndeterminate = false中得到此错误; 因为调用打开一个新线程,我该如何解决? 错误是: […]

死锁从webapi中的异步DelegatingHandler读取异步响应内容

问题 我在WebAPI中使用DelegatingHandler来读取响应内容并将其审核到数据库。 当代码到达.ReadAsStringAsync()时,它似乎锁定并阻止其他请求完成。 我只知道这一点,因为当我删除违规行时,它完美无缺。 public static void Register(HttpConfiguration config) { config.MessageHandlers.Add(new ResourceAuditHandler()); } public class ResourceAuditHandler : DelegatingHandler { protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var response = await base.SendAsync(request, cancellationToken); string content = “”; if (response.Content != null) { //THIS SEEMS TO CREATE DEADLOCK! content = await response.Content.ReadAsStringAsync(); } AuditResponseToDatabase(content); return […]

在控制台或Web应用程序中使用async / await

据我所知,C#中的async / awaitfunction将await调用之间的段拆分为在每个等待的方法在单独的工作线程上返回后在调用线程上运行的回调方法。 在等待时间内,调用线程是“空闲的”。 必须通过某种事件循环在调用线程上调度回调。 此事件循环仅存在于Windows窗体或WPF等GUI应用程序中。 释放此循环可确保UI在长时间操作期间保持对其他用户交互的响应。 控制台应用程序和Web应用程序(ASP.NET)没有此类事件循环,因此此回调机制不起作用。 但话说回来,他们没有事件循环,因为他们不需要。 没有用户在任何时候尝试与正在运行的程序进行交互,期望立即反馈。 所以没有必要释放调用线程。 操作使用的线程数无关紧要,它只在最后一位完成后返回。 那么在控制台和Web应用程序中使用async和await是什么,或者通常是任何类型的非交互式代码,例如Windows服务? 与简单的同步调用相比,它有何不同或更高效? 我正在设计一个由GUI和非交互(服务和Web)程序使用的API,并且很难理解它在非GUI环境中的行为。

如何在ASP.NET MVC中使用Windows语音合成器

我尝试使用System.Speech类在ASP.NET mvc应用程序中生成语音。 [HttpPost] public ActionResult TTS(string text) { SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(); speechSynthesizer.Speak(text); return View(); } 但它给出了以下错误。 System.InvalidOperationException: ‘An asynchronous operation cannot be Started at this time. Asynchronous operations may only be started within an asynchronous handler or module or during certain events in the Page lifecycle. If this exception occurred while executing a […]

如何从async方法获取button_ClickEvent中的字符串

我们有以下代码: public static CookieContainer cookies; public static HttpWebRequest GetNewRequest(string targetUrl, CookieContainer SessionCookieContainer) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(targetUrl); request.CookieContainer = SessionCookieContainer; request.AllowAutoRedirect = false; return request; } public async static Task MakeRequest(HttpWebRequest request, CookieContainer SessionCookieContainer, Dictionary parameters = null) { HttpWebResponse response; request.UserAgent = “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5Accept: */*”; […]

异步任务暂停循环恢复

我有一个示例代码,取自MSDN,我想在while循环中实现Pause / Resumefunction。 任何人都可以提出一个解决方案/ parern吗? private async void startButton_Click(object sender, RoutedEventArgs e) { resultsTextBox.Clear(); // Instantiate the CancellationTokenSource. cts = new CancellationTokenSource(); try { await AccessTheWebAsync(cts.Token); resultsTextBox.Text += “\r\nDownloads complete.”; } catch (OperationCanceledException) { resultsTextBox.Text += “\r\nDownloads canceled.\r\n”; } catch (Exception) { resultsTextBox.Text += “\r\nDownloads failed.\r\n”; } cts = null; } private void cancelButton_Click(object sender, […]

请求消息已发送。 无法多次发送相同的请求消息

我的代码在这里有什么问题吗? 我一直收到这个错误: System.InvalidOperationException:请求消息已发送。 无法多次发送相同的请求消息。 我的HttpRequestMessage在Func中,所以我想每次传入func()时都会得到一个全新的请求。 public async Task GetAsync(HttpRequestMessage request) { return await RequestAsync(() => request); } public async Task RequestAsync(Func func) { var response = await ProcessRequestAsync(func); if (response.StatusCode == HttpStatusCode.Unauthorized) { WaitForSomeTime(); response = await ProcessRequestAsync(func); } return response; } private async Task ProcessRequestAsync(Func func) { var client = new HttpClient(); var response […]

如何等待webclient OpenReadAsync完成

我在Windows Phone 8.1应用程序中使用WebClient从Internet下载一些东西。 下面是我在我的应用程序中使用的示例代码 – 我在下面调用方法,但我的webclient没有等待完成读取操作并在OpenReadAsync调用后立即返回。 我怎样才能确保我的方法返回操作必须等到OpenReadCompleted事件完成后? 我见过多个类似的问题,但找不到解决方案。 MyCustomObject externalObj; // my custom object private static void CheckNetworkFile() { try { WebClient webClient = new WebClient(); webClient.OpenReadCompleted += (s, e) => { externalObj = myReadWebclientResponse(e.Result); // my custom method to read the response }; webClient.OpenReadAsync(new Uri(“http://externalURl.com/sample.xml”, UriKind.Absolute)); } catch (Exception) { externalObj = null; } […]

等待和异步阻止UI

我写了一个winforms应用程序来搜索磁盘上的文件(为了这个问题,哪个文件并不重要)。 问题是它甚至可以是100,000个文件。 所以这个操作需要时间。 我想要实现的是将搜索操作作为异步操作而不是阻止UI线程,这样表单就不会卡住。 我可以使用backgroundWorker执行此操作,但由于某些原因不能使用async \ await机制。 这是我的代码: private async void button_FindFiles_Click(object sender, EventArgs e) { await SearchFilesUtil.SearchPnrFilesAsync(this.textBox_mainDirectory.Text); MessageBox.Show(“After SearchPnrFilesAsync”); } public async static Task SearchPnrFilesAsync(string mainDir) { foreach (string file in Directory.EnumerateFiles(mainDir, “.xml”, SearchOption.AllDirectories)) { var fileContenet = File.ReadAllText(file); var path = Path.Combine(@”C:\CopyFileHere”, Path.GetFileName(file)); using (StreamWriter sw = new StreamWriter(path)) { await sw.WriteAsync(fileContenet); } […]