Tag: 异步

用于自动取消和重新启动任务的模式

是否有建议的自我取消和重启任务模式? 例如,我正在研究背景拼写检查程序的API。 拼写检查会话被包装为Task 。 每个新会话都应该取消之前的会话并等待其终止(正确地重新使用拼写检查服务提供商等资源)。 我想出了这样的事情: class Spellchecker { Task pendingTask = null; // pending session CancellationTokenSource cts = null; // CTS for pending session // SpellcheckAsync is called by the client app public async Task SpellcheckAsync(CancellationToken token) { // SpellcheckAsync can be re-entered var previousCts = this.cts; var newCts = CancellationTokenSource.CreateLinkedTokenSource(token); this.cts = newCts; […]

使用void进行异步exception处理

我正在使用Async CTP编写IO重型控制台应用程序。 但我遇到exception问题。 public static void Main() { while (true) { try{ myobj.DoSomething(null); } catch(Exception){} Console.Write(“done”); //… } } //… public async void DoSomething(string p) { if (p==null) throw new InvalidOperationException(); else await SomeAsyncMethod(); } 并发生以下情况:“完成”被写入控制台,然后我在调试器中得到exception,然后我按继续我的程序存在 。 是什么赋予了?

如何使用async来增加WinForms性能?

我正在做一些处理器繁重的任务,每次我开始执行该命令我的winform冻结比我甚至无法移动它直到任务完成。 我使用微软的相同程序,但似乎没有任何改变。 我的工作环境是使用.net 4.5的visual studio 2012 private async void button2_Click(object sender, EventArgs e) { Task task = OCRengine(); rtTextArea.Text = await task; } private async Task OCRengine() { using (TesseractEngine tess = new TesseractEngine( “tessdata”, “dic”, EngineMode.TesseractOnly)) { Page p = tess.Process(Pix.LoadFromFile(files[0])); return p.GetText(); } }

如何使用webclient异步下载多个文件,但一次只能一个?

很难找到使用webclient类异步方法下载多个文件的代码示例,但一次下载一个。 如何启动异步下载,但要等到第一个完成,直到第二个,等等。基本上是一个问题。 (注意我不想使用同步方法,因为异步方法的function增加了。) 以下代码立即启动我的所有下载。 (进度条到处都是) private void downloadFile(string url) { WebClient client = new WebClient(); client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged); client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted); // Starts the download btnGetDownload.Text = “Downloading…”; btnGetDownload.Enabled = false; progressBar1.Visible = true; lblFileName.Text = url; lblFileName.Visible = true; string FileName = url.Substring(url.LastIndexOf(“/”) + 1, (url.Length – url.LastIndexOf(“/”) – 1)); client.DownloadFileAsync(new Uri(url), […]

取消不接受CancellationToken的异步操作的正确方法是什么?

取消以下内容的正确方法是什么? var tcpListener = new TcpListener(connection); tcpListener.Start(); var client = await tcpListener.AcceptTcpClientAsync(); 简单地调用tcpListener.Stop()似乎会导致ObjectDisposedException ,而AcceptTcpClientAsync方法不接受CancellationToken结构。 我完全错过了一些明显的东西吗

暂停/恢复异步任务的模式?

我有一个主要是IO绑定的连续任务(后台拼写检查器与拼写检查服务器通信)。 有时,此任务需要暂停并稍后恢复,具体取决于用户活动。 虽然暂停/恢复基本上是async/await所做的,但我发现很少有关于如何为异步方法实现实际暂停/播放逻辑的信息。 有推荐的模式吗? 我也考虑过使用Stephen Toub的AsyncManualResetEvent ,但认为这可能是一种矫枉过正。

并行执行任务

好吧,基本上我有一堆任务(10),我想同时启动所有任务并等待它们完成。 完成后我想执行其他任务。 我读了很多关于这方面的资源,但我无法为我的具体情况做好准备…… 这是我目前拥有的(代码已经简化): public async Task RunTasks() { var tasks = new List { new Task(async () => await DoWork()), //and so on with the other 9 similar tasks } Parallel.ForEach(tasks, task => { task.Start(); }); Task.WhenAll(tasks).ContinueWith(done => { //Run the other tasks }); } //This function perform some I/O operations public async Task […]

从WCF服务调用异步方法

我想从WCF服务调用异步方法,如: [ServiceContract] interface IService { [OperationContract] int SomeMethod(int data); } int SomeMethod(int data) { var query = … build LINQ query; var response = await query.ToListAsync(); return response.Length; } 我不想将async添加到IService接口或SomeMethod方法。 使用异步方法是一个内部问题,不应该在接口中反映出来。 我怎样才能做到这一点? 澄清: 我的问题是在非async方法中使用await 。 我不希望服务合同发生变化(客户端不一定知道async是什么),我不想将方法拆分为BeginSomeMethod和EndSomeMethod 。 我想要一个await 内部使用await方法。

.NET中管理单独(单个)线程上任务队列的最佳方式

我知道异步编程多年来已经发生了很多变化。 我有点尴尬,我让自己在34岁时就生锈了,但我依靠StackOverflow让我加快速度。 我想要做的是在一个单独的线程上管理“工作”队列,但是这样一次只能处理一个项目。 我想在这个线程上发布工作,它不需要将任何东西传递给调用者。 当然,我可以简单地启动一个新的Thread对象并让它在一个共享的Queue对象上循环,使用sleeps,interrupt,wait handle等等。但是我知道事情从那以后变得更好了。 我们有BlockingCollection , Task , async / await ,更不用说可能抽象了很多的NuGet包。 我知道“什么是最好的……”这些问题通常是不受欢迎的,所以我会通过说“目前推荐的是什么……”的方式来改写,最好使用内置的.NET机制。 但是如果第三方NuGet包简化了一堆东西,它也是如此。 我认为一个TaskScheduler实例的固定最大并发性为1,但似乎现在可能没有那么笨重的方法了。 背景 具体来说,我在这种情况下尝试做的是在Web请求期间排队IP地理定位任务。 相同的IP可能会多次排队等待地理定位,但是任务将知道如何检测并尽快跳过,如果它已经解决了。 但请求处理程序只是将这些() => LocateAddress(context.Request.UserHostAddress)调用抛出到队列中,让LocateAddress方法处理重复的工作检测。 我正在使用的地理位置API不喜欢被请求轰炸,这就是为什么我想一次将它限制为单个并发任务。 但是,如果允许通过简单的参数更改轻松扩展到更多并发任务,那将会很好。