Tag: asynchronous

使用HttpClient和ContinueWith的Paralell.ForEach

我有一个方法尝试从并行的几个URL下载数据,并返回IEnumerable反序列化类型 该方法如下所示: public IEnumerable DownloadContentFromUrls(IEnumerable urls) { var list = new List(); Parallel.ForEach(urls, url => { lock (list) { _httpClient.GetAsync(url).ContinueWith(request => { var response = request.Result; //todo ensure success? response.Content.ReadAsStringAsync().ContinueWith(text => { var results = JObject.Parse(text.Result) .ToObject<IEnumerable>(); list.AddRange(results); }); }); } }); return list; } 在我的unit testing中(我存根_httpClient返回一组已知的文本)我基本上得到了 序列不包含任何元素 这是因为该方法在任务完成之前返回。 如果我在.ContinueWith()调用结束时添加.Wait(),它会通过,但我确定我在这里滥用了API …

为什么不调用Task .Result死锁?

几个月前阅读这篇文章之后,我变得很擅长获取Task的Result ,并且通过ConfigureAwait(false)或Task.Run不断地将所有调用包裹Task.Run 。 但是,由于某种原因,以下代码成功完成: public static void Main(string[] args) { var arrays = DownloadMany(); foreach (var array in arrays); } IEnumerable DownloadMany() { string[] links = { “http://google.com”, “http://microsoft.com”, “http://apple.com” }; using (var client = new HttpClient()) { foreach (var uri in links) { Debug.WriteLine(“Still here!”); yield return client.GetByteArrayAsync(uri).Result; // Why doesn’t this deadlock? } […]

使用asyc await从事件更新UI

我试图了解如何在使用async / await模式时从事件更新UI。 下面是我在WinForm应用程序上使用的测试代码。 我甚至不确定这是正确的方法。 允许pwe_StatusUpdate方法更新UI有什么必要? 抛出跨线程操作错误。 谢谢阅读。 // calling code ProcessWithEvents pwe = new ProcessWithEvents(); pwe.StatusUpdate += pwe_StatusUpdate; await pwe.Run(); void pwe_StatusUpdate(string updateMsg) { // Error Here: Cross-thread operation not valid: Control ‘_listBox_Output’ accessed from a thread other than the thread it was created on. _listBox_Output.Items.Add(updateMsg); } – // Class with long running process […]

在一次设置最大运行任务时等待多个异步任务

所以我刚开始尝试理解异步,任务,lambda等等,我无法让它像我想的那样工作。 使用下面的代码我希望它能锁定btnDoWebRequest,将一个未知数量的WebRequests作为任务执行,并且一旦所有任务完成,就解锁btnDoWebRequest。 但是我只希望最多3个或者我一次运行的任务数量,这部分来自于我有一组任务,一次只运行X. 但是在以多种方式尝试和修改我的代码之后,它将始终立即跳回并重新启用btnDoWebRequest。 当然VS警告我需要等待,目前在“.ContinueWith((任务)”和“await Task.WhenAll(requestInfoList .Select(async i =>”)中的异步,但似乎无法工作在哪里或如何投入所需的等待。当然,因为我仍然在学习,所以我很有可能在这一切都错了,整个事情需要重新修改。所以任何帮助都将非常感激。 谢谢 private SemaphoreSlim maxThread = new SemaphoreSlim(3); private void btnDoWebRequest_Click(object sender, EventArgs e) { btnDoWebRequest.Enabled = false; Task.Factory.StartNew(async () => await DoWebRequest()).Wait(); btnDoWebRequest.Enabled = true; } private async Task DoWebRequest() { List requestInfoList = new List(); for (int i = 0; dataRequestInfo.RowCount – 1 > i; […]

如果我正在返回一个任务而不是等待任何事情,我应该使用异步

在异步方法中代码没有await任何东西,是否有人将其标记为异步,等待任务,然后返回? 除了潜在的不必要之外,这样做的负面影响是什么? 对于此示例,请假设QueryAsync返回Task 。 private static async Task InsertRecord_AsyncKeyword(SqlConnection openConnection) { int autoIncrementedReferralId = await openConnection.QueryAsync(@” INSERT INTO… SELECT CAST(SCOPE_IDENTITY() AS int)” ); return autoIncrementedReferralId; } private static Task InsertRecord_NoAsyncKeyword(SqlConnection openConnection) { Task task = openConnection.QueryAsync(@” INSERT INTO… SELECT CAST(SCOPE_IDENTITY() AS int)” ); return task; } // Top level method using (SqlConnection connection = await […]

UdpClient.ReceiveAsync正确提前终止

美好的一天。 我使用UdpClient并使用它包装。 为了阅读我有异步方法: private async Task Receive(UdpClient client, CancellationToken breakToken) { // Выход из async, если произошёл CancellationRequest breakToken.ThrowIfCancellationRequested(); UdpReceiveResult result; try { result = await client.ReceiveAsync().WithCancellation(breakToken); } catch(OperationCanceledException) { // Штатная ситуация ручной остановки Task-а } return result.Buffer; } WithCancellation是我提前终止的扩展方法: public static async Task WithCancellation( this Task task, CancellationToken cancellationToken) { var tcs = […]

如何从非异步方法调用异步方法?

我有以下方法: public string RetrieveHolidayDatesFromSource() { var result = this.RetrieveHolidayDatesFromSourceAsync(); /** Do stuff **/ var returnedResult = this.TransformResults(result.Result); /** Where result gets used **/ return returnedResult; } private async Task RetrieveHolidayDatesFromSourceAsync() { using (var httpClient = new HttpClient()) { var json = await httpClient.GetStringAsync(SourceURI); return json; } } 以上不起作用,似乎没有正确返回任何结果。 我不知道我在哪里错过强制等待结果的陈述? 我希望RetrieveHolidayDatesFromSource()方法返回一个字符串。 以下工作正常,但它是同步的,我相信它可以改进吗? 请注意,下面是同步的,我想将其更改为异步,但由于某种原因无法解决问题。 public string RetrieveHolidayDatesFromSource() […]

WCF REST未异步处理

我们目前正在IIS中为我们的站点实现一个新的WCF REST服务,在许多页面上,我们可能会异步使用JQuery进行一些AJAX调用。 问题是似乎WCF(在服务器端)同步执行。 在页面加载时,我们对3种不同的方法进行3次单独调用。 使用日志记录,我可以看到它们都在大约5ms内相互访问global.asax文件。 从那里,日志记录显示按退出global.asax的顺序执行的所有操作(不一定是我们通过javascript从页面调用的顺序)。 我希望每次调用都能收到自己的线程并单独返回。 即使使用调试器附加,我也可以看到它不会执行下一个方法,直到我逐步执行当前方法。 以下是我为实现使用异步模型而实现的三种方法的操作合同。 [OperationContract(AsyncPattern = true)] [WebInvoke( Method = “POST” , UriTemplate = “/ListUserPreferences” , BodyStyle = WebMessageBodyStyle.Wrapped , ResponseFormat = WebMessageFormat.Json , RequestFormat = WebMessageFormat.Json )] IAsyncResult BeginListUserPreferences(AsyncCallback callback, object state); Result<List<Data.EnumerationItem>> EndListUserPreferences(IAsyncResult asyncResult); [OperationContract(Name = “GetUserSecure”, AsyncPattern = true)] [WebInvoke( Method = “POST” , UriTemplate = “/GetUser” […]

之前是否发现了在C#中使用async / await?

在关于async / await的stackoverflow之前的一个问题之后,在我看来,await比营销建议更强大和更通用。 它似乎是构建计算表达式的一般方法,就像在F#中一样。 因此,经过一番努力,我想出了一些成功执行的代码,如下所示。 using FluentAssertions; using System.Collections.Generic; namespace EnumerableViaAwait.Specs { [global::Microsoft.VisualStudio.TestTools.UnitTesting.TestClass] public class MyTestClass { public IEnumerable Numbers() { return EnumeratorMonad.Build(async Yield => { await Yield(11); await Yield(22); await Yield(33); }); } [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethod] public void TestEnum() { var v = Numbers(); var e = v.GetEnumerator(); int[] expected = { 11, 22, 33 }; […]

async / await with ConfigureAwait的continueOnCapturedContext参数和SynchronizationContext用于异步延续

我想先把代码放一下,然后解释一下情况并根据这个问题提出我的问题: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private async void Button_Click_2(object sender, RoutedEventArgs e) { var result = await GetValuesAsync(); Foo.Text += result; } public async Task GetValuesAsync() { using (var httpClient = new HttpClient()) { var response = await httpClient .GetAsync(“http://www.google.com”) .ConfigureAwait(continueOnCapturedContext: false); // This is the continuation […]