Tag: 异步 等待

将同步zip操作转换为异步

我们有一个现有的库,其中一些方法需要转换为异步方法。 但是我不确定如何使用以下方法(error handling已被删除)。 该方法的目的是压缩文件并将其保存到磁盘。 (请注意,zip类不会公开任何异步方法。) public static bool ZipAndSaveFile(string fileToPack, string archiveName, string outputDirectory) { var archiveNameAndPath = Path.Combine(outputDirectory, archiveName); using (var zip = new ZipFile()) { zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression; zip.Comment = $”This archive was created at {System.DateTime.UtcNow.ToString(“G”)} (UTC)”; zip.AddFile(fileToPack); zip.Save(archiveNameAndPath); } return true; } 实现可能如下所示: public static async Task ZipAndSaveFileAsync(string fileToPack, string archiveName, string […]

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 […]

在我想要等待的方法上获取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) […]

异步WCF调用保存线程?

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

async / await与手工制作的延续:是否巧妙地使用了ExecuteSynchronously?

我最近写了以下代码: Task ExecAsync( string connectionString, SqlCommand cmd, Func resultBuilder, CancellationToken cancellationToken = default(CancellationToken) ) { var tcs = new TaskCompletionSource(); SqlConnectionProvider p; try { p = GetProvider( connectionString ); Task openTask = p.AcquireConnectionAsync( cmd, cancellationToken ); openTask .ContinueWith( open => { if( open.IsFaulted ) tcs.SetException( open.Exception.InnerExceptions ); else if( open.IsCanceled ) tcs.SetCanceled(); else { var […]

Task.WhenAll() – 它是否创建了一个新线程?

根据MSDN : 创建一个任务,该任务将在所有提供的任务完成后完成。 当调用Task.WhenAll()时,它会创建一个任务,但这是否意味着它创建了一个新线程来执行该任务? 例如,下面的控制台应用程序中创建了多少个线程? class Program { static void Main(string[] args) { RunAsync(); Console.ReadKey(); } public static async Task RunAsync() { Stopwatch sw = new Stopwatch(); sw.Start(); Task google = GetString(“http://www.google.com”); Task microsoft = GetString(“http://www.microsoft.com”); Task lifehacker = GetString(“http://www.lifehacker.com”); Task engadget = GetString(“http://www.engadget.com”); await Task.WhenAll(google, microsoft, lifehacker, engadget); sw.Stop(); Console.WriteLine(“Time elapsed: ” + sw.Elapsed.TotalSeconds); […]

异步/等待代码中的竞争条件

我只是想知道下面的代码中是否出现竞争条件: int readingFiles; async Task ReadFile (string file) { ++readingFiles; var text = await Stream.ReadFileAsync(file); –readingFiles; return text; } 如果线程池线程执行ReadFile方法,则readFiles将由两个不同的线程访问,而readingFiles变量不受任何同步惯用法的保护。 这意味着对于执行“–readingFiles”的其他线程,readFiles的第一次更新不应该是可见的。 但是,我从未在“–readingFiles”之后看到readingFiles等于-1。 我检查同一个线程是否使用Thread.CurrentThread执行++和 – 操作。 在大多数情况下,它不是同一个线程,我仍然没有看到readingFiles为-1。 即使存在竞争条件且readingFiles不易变,为什么我不能看到这种竞争条件的影响?

PostSubmitter的异步CTP

我正在尝试构建一个REST客户端使用Async CTP。 我是CTP的新手,因此,通过互联网上的一些例子,我得到了一个仅用于发布(GET或POST)的clas。 到目前为止这是class级: using System; using System.Collections.Specialized; using System.IO; using System.Net; using System.Text; using System.Threading.Tasks; using System.Web; namespace RESTClient.Core { /// /// Submits post data to a url. /// public class PostSubmitter { #region Backing Store private string m_url = string.Empty; private NameValueCollection m_values = new NameValueCollection(); private PostTypeEnum m_type = PostTypeEnum.Get; #endregion #region […]

在ContinueWith()之后,ConfigureAwait(False)不会更改上下文

我不知道我做错了什么或者我在Async库中发现了一个错误,但是在使用continueWith()回到Synchronized上下文后运行一些异步代码时我遇到了一个问题。 更新:代码现在运行 using System; using System.ComponentModel; using System.Net.Http; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication1 { internal static class Program { [STAThread] private static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } public partial class Form1 : Form { public Form1() { InitializeComponent(); MainFrameController controller = new MainFrameController(this); //First async call without continueWith controller.DoWork(); //Second […]

如何异步这个长时间运行的方法?

我有这种方法,我想异步运行,以便我可以在运行时做其他事情。 它不依赖于任何其他Async方法(它不会调用另一个资源,下载文件或任何东西)。 我想避免使用new Task() , Task.Factory.StartTask()和Task.Run() ,如果可能的话。 是否可以异步运行此方法,使用整洁,可读的代码并且不显式使用Task? 如果不是,那么异步运行该方法的最简单方法是什么? 注意:请不要关心方法中的愚蠢逻辑 – 我把它煮成故意慢但不显示我的实际代码。 public static void main(string[] args) { RunMySlowLogic(); } private void RunMySlowLogic() { while (true) for (int i=0; i<100000000;i++) if (i == new Random().Next(999)) return true; } 目前,我认为我需要将方法包装在lambda或Task中并将其标记为异步。 等待去哪儿了?