Tag: 异步

异步方法不能并行运行

在下面的代码中,在B方法中,代码为Trace.TraceInformation(“B – Started”); 永远不会被召唤。 该方法应该并行运行吗? using System.Collections.Generic; using System.Diagnostics; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { private static async Task A() { for (;;) { } } private static async Task B() { Trace.TraceInformation(“B – Started”); } static void Main(string[] args) { var tasks = new List { A(), B() }; Task.WaitAll(tasks.ToArray()); } } […]

c#async没有等待

在这里的文档: http : //msdn.microsoft.com/en-us/library/hh191443.aspx它表明: 如果异步方法不使用await运算符来标记挂起点,则该方法将作为同步方法执行,尽管存在异步修饰符。 编译器会为此类方法发出警告。 我相信这是警告: 这种异步方法缺少’await’运算符并将同步运行。 考虑使用’await’运算符等待非阻塞API调用,或’await Task.Run(…)’在后台线程上执行CPU绑定工作。 然后,在另一个引用的链接http://msdn.microsoft.com/en-us/library/windows/apps/hh994635.aspx中 ,它显示的示例如下: public class Example { // … private async void NextMove_Click(object sender, RoutedEventArgs e) { await Task.Run(() => ComputeNextMove()); // Update the UI with results } private async Task ComputeNextMove() { // … } // … } 在这里,我假设 ComputeNextMove本质上是一个同步方法,本身不会调用await。 这似乎与编译器警告的发布相矛盾(除非它是一个坏的例子……) 如果我没有在异步调用堆栈的END处调用.net异步方法,比如HttpClient.GetStringAsync并且我想实现一些具体的“长时间运行”同步逻辑,那么有更合适的方法吗? 也许我的假设不正确, ComputeNextMove可以声明为private void […]

如何结合异步调用编程我的进度条?

首先,我对Windows Phone 8开发的经验不是很大,但有些东西看起来像我更熟悉的ASP.NET Framework。 我想要一个不确定的进度条,它在后台执行Web请求时显示,并在处理请求时隐藏。 我的解决方案有效,但我对它不满意 (并且progressBar / Text位于一个pivot元素内以测试function) 我们有以下内容: 一个名为“MainPage”的XAML页面,带有Pivot元素。 … 我的代码隐藏看起来像这样: protected override void OnNavigatedTo( App.ViewModel.LoadSomething(); } Function LoadSomething()显示/隐藏进度条和加载文本。 这是我不满意的部分: // Method of the ViewModel public void LoadSomething() { //Showing progress bar and loading-text var mainPage = (MainPage)App.RootFrame.Content; mainPage.ProgressBar.Visibility = Visibility.Visible; mainPage.ProgressText.Visibility = Visibility.Visible; // form the URI UriBuilder fullUri = new UriBuilder(string.Format(“http://somepage…”)); […]

在我想要等待的方法上获取a无法等待无效

我正在写一个WPF应用程序的团队。 我们必须这样做,以便当用户隐藏/显示不同的列时,它将反映在其中一个视图的ReportViewer控件中。 在测试中,我们发现将数据添加到ReportViewer的数据源需要很长时间; 有时大约几秒到一分钟。 我想为用户太久了。 所以我正在尝试使用C#的异步并等待。 但是,当我将await应用于进程hog然后编译它时,我从C#编译器得到一个错误,“无法等待’void’”。 在这种情况下,我无法改变.NET框架返回的内容,它的空白。 那么我该如何处理这种情况呢? 这是代码: private async Task GenerateReportAsync() { DataSet ds = new DataSet(); DataTable dt = new DataTable(); dt.Clear(); int iCols = 0; //Get the column names if (Columns.Count == 0) //Make sure it isn’t populated twice { foreach (DataGridColumn col in dataGrid.Columns) { if (col.Visibility == Visibility.Visible) […]

SqlConnection.Open vs SqlConnection.OpenAsync – 这两者之间的区别是什么?

编辑:这归结为为什么只更改SqlConnection.Open()以等待异步代码中的SqlConnection.OpenAsync()导致强烈不同的行为。 除了明显的异步行为之外,异步代码中的同步代码中的SqlConnection.Open调用和等待SqlConnection.OpenAsync调用之间的区别是什么? 底层连接是否与数据库异步? OpenAsync上的文档是精简版, https: //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.openasync%28v=vs.110%29.aspx?f = 255 & MSPPError = -2147217396。 Open的异步版本,它使用ConnectionString指定的设置打开数据库连接。 此方法使用CancellationToken.None调用虚方法OpenAsync。(从DbConnectioninheritance。) 我觉得有趣的是,之前连接字符串中需要async = true,而在.net 4.5+中则不再需要它。 连接的行为有何不同? https://msdn.microsoft.com/en-us/library/hh211418(v=vs.110).aspx 从.NET Framework 4.5开始,这些方法不再需要在连接字符串中使用Asynchronous Processing = true。 当我碰巧在异步应用程序中使用同步SqlConnection.Open并加载它时,我发现它执行得非常糟糕,早期运行连接池。 我希望打开连接是阻塞的,但是,在这些连接上执行异步命令(通过dapper)的行为有所不同。 那么,OpenAsync的做法有何不同? 编辑: 作为重现问题的请求代码(或者可能表现出差异)。 在执行大约180个并发异步命令时遇到运行此情况的Open()连接超时,使用OpenAsync()即使在超过300个并发命令时也不会遇到exception。 您可以推动并发以最终使其超时,但它肯定会更深入地执行并发命令。 using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using Dapper; using Nito.AsyncEx; namespace AsyncSqlConnectionTest { class […]

如何在同步代码中使用await / async?

我正在尝试使用await / async以使某些同步代码异步。 例如,这可以解除UI线程的阻塞: private async void button1_Click(object sender, EventArgs e) { var task = DoRequestAsync(); textBox1.Text = “starting async task”; var text = await task; textBox1.Text = text; } private async Task DoRequestAsync() { try { var client = new HttpClient(); client.Timeout = new TimeSpan(0, 0, 0, 5); await client.GetAsync(“http://123.123.123.123”); // force a timeout […]

如何在asp.net C#4.0中调用异步方法?

我知道.net 4.5有等待,异步关键字允许轻松调用异步方法。 我目前正在研究如何在C#4.0中进行异步调用。 我想要的一个例子是在datagrid是数据绑定的情况下进行异步调用。 如果你能给我一些链接我真的很感激。

InvalidOperationException:撤消操作遇到的上下文与相应的Set操作中应用的上下文不同

我得到以下exception: Exception Type: System.InvalidOperationException Exception Message: The Undo operation encountered a context that is different from what was applied in the corresponding Set operation. The possible cause is that a context was Set on the thread and not reverted(undone). Exception Stack: at System.Threading.SynchronizationContextSwitcher.Undo() at System.Threading.ExecutionContextSwitcher.Undo() at System.Threading.ExecutionContext.runFinallyCode(Object userData, Boolean exceptionThrown) at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteBackoutCodeHelper(Object backoutCode, Object userData, […]

异步WCF调用保存线程?

在另一个SO问题中 ,我被建议发送异步网络请求,而不是在后台线程上发送同步请求。 原因是我不浪费一个线程。 我试图理解这是怎么回事。 这是最初的方法。 我可以理解这里有两个线程。 一个是主线程(1),一个是进行WCF调用的后台线程(Task.Run)(2): 这是我建议的方法的草图。 我试图了解如何保存线程。 在异步WCF调用之后,是否不会为异步WCF调用的回调创建另一个线程? 在进一步思考之后,如果不需要回调处理,可能只使用一个线程?

使用c#使下载可恢复

我正在使用此方法( WebClient类)从Internet下载文件: private Task DownloadUpdate(string url, string fileName) { var wc = new WebClient(); return wc.DownloadFileTaskAsync(new Uri(url), @”c:\download” + fileName); } 如何使用上面的代码使下载恢复 ?