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

同步控制台应用程序中不同线程的事件

我感觉像是一个总的菜鸟问这个,但无论如何,它在这里: 我想知道从不同线程同步事件的最简单方法是什么。 一些示例代码: class Program { static void Main(string[] args) { Console.WriteLine(“# started on:” + Thread.CurrentThread.ManagedThreadId); tt t = new tt(); t.First += new EventHandler(t_First); t.Second += new EventHandler(t_Second); Task task = new Task(new Action(t.Test)); task.Start(); while (true) { Console.ReadKey(); Console.WriteLine(“# waiting on:” + Thread.CurrentThread.ManagedThreadId); } } static void t_Second(object sender, EventArgs e) { Console.WriteLine(“- […]

使用长时间运行的后台消费者任务时,Task.Factory.StartNew中的静默exception?

这通知未处理的exception: new Thread(_ => { throw new Exception(); }).Start(); 这没有(至少在你等待/检索结果之前): Task.Factory.StartNew(() => { throw new Exception(); }); 为什么? 发生exception的线程发生了什么? 它死了吗? 这是一个运行任务但不需要其结果或需要等待它的问题,如下所示: _operationQueue = new BlockingCollection(); Task.Factory.StartNew(() => { foreach (var item in _operationQueue.GetConsumingEnumerable()) { // do something that throws } }, TaskCreationOptions.LongRunning); 在这种情况下, _operationQueue处于什么状态? 我知道我可以使用Continition with TaskContinuationOptions.OnlyOnFaulted,你能继续处理吗?

C#/ .NET 4.5 – 为什么“等待Task.WhenAny”在WPF应用程序的UI线程中提供Task.Delay时永远不会返回?

鉴于以下代码,为什么Task.WhenAny在提供1秒的Task.Delay时永远不会返回? 从技术上讲,我不确定它是否会在延长的时间后返回,但是在15秒左右之后我不会手动终止该过程。 根据文档,我不需要手动启动delayTask,事实上,如果我尝试手动启动,我会收到exception。 当用户选择WPF应用程序中的上下文菜单项时,将从UI线程调用代码,但如果我为上下文菜单项指定了click方法,则在新线程中运行此代码时,它可以正常工作。 public void ContextMenuItem_Click(object sender, RoutedEventArgs e) { … SomeMethod(); … } public void SomeMethod() { … SomeOtherMethod(); …. } public void SomeOtherMethod() { … TcpClient client = Connect().Result; … } //In case you’re wondering about the override below, these methods are in //different classes i’ve just simplified things here a bit […]

如果有条件地执行任务,异步方法应该怎么做?

假设我有一个等待任务的方法。 此方法还返回一个Task。 例如: public async virtual Task Save(String path) { if (NewWords.Any()) { await FileManager.WriteDictionary(path, NewWords, true); } else await Task.Run(() => { }); } 是个 else await Task.Run(() => { }); 这里有必要还是我可以自由离开? 如果它存在/不存在有什么区别吗? 也许我应该采取其他一些方法吗?

我该如何解决这个错误? – 委托’System.Action ‘不带0个参数

以下代码: var ui = TaskScheduler.FromCurrentSynchronizationContext(); Task.Factory.StartNew(() => { listBox1.Items.Add(“Starting to crawl ” + srMainSiteURL + “…”); } , ui); 导致以下错误: Delegate ‘System.Action’ does not take 0 arguments 在查看其他线程后,我无法确定也无法理解错误的原因。 请指教。

Task.ContinueWith不工作我的预期

请考虑以下代码。 我开始执行一个什么都不做的任务,然后使用ContinueWith()开始对一个递增计数器的方法进行10次调用。 当我运行该程序时,它打印“0”,表示还没有调用increment()方法。 我期待它被调用10次,因为那是我调用ContinueWith()的次数。 如果我取消注释“Thread.Sleep(20)”行,则按预期打印“10”。 这在发布或调试模式下发生。 我的系统是运行Windows 7 x64的超级线程(8个逻辑核心)的核心2 quad。 我假设我对Task.ContinueWith()如何工作有一些基本的误解…. using System; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication4 { class Program { static void Main() { using (var task = Task.Factory.StartNew(()=>{})) { for (int i = 0; i increment()); // Thread.Sleep(20); // Uncomment to print 10 instead of 0. } task.Wait(); } // This […]

在UI线程上创建和启动任务

当一个在工作线程上调用的方法需要在UI线程上运行代码并在执行其他操作之前等待它完成时,可以这样做: public int RunOnUi(Func f) { int res = Application.Current.Dispatcher.Invoke(f); return res; } 但是,如果我想用任务做什么呢? 有没有办法让RunOnUi方法创建一个在UI上启动并返回它的任务,以便调用者(在工作线程上运行)可以等待它? 适合以下签名的东西: public Task StartOnUi(Func f) ? 一种方法如下: public Task RunOnUi(Func f) { var task = new Task(f); task.Start(_scheduler); return task; } 这里,假设_schduler持有ui TaskScheduler 。 但是我不太习惯于创建“冷”任务并使用start方法来运行它们。 这是“推荐”的方式还是有更优雅的方式来做到这一点?

如何在任务抛出exception而不等待终结器时使应用程序崩溃

我们在.Net 4(没有异步等待可用)应用程序中使用任务,有时它们用于启动“Fire and Forget”操作,如下所示: private void Test() { Task task = Task.Factory.StartNew(() => { throw new ApplicationException(“Test”); }); } 我们希望此exception在不等待任务的情况下使应用程序崩溃(否则将其置于任务中是没有意义的,至少在我们的场景中)并且不等待终结器,因为我们想要在发生意外错误时关闭应用程序避免状态损坏(我们正在保存exception发生时的状态)。 我的猜测是,不知怎的,我们应该使用延续任务但是将延续代码放在另一个不会使应用程序崩溃的任务中,所以我在这里被阻止了。 任何帮助将非常感谢 编辑:如果切换到ThreadPool,结果是预期的结果。 以下代码崩溃了应用程序: ThreadPool.QueueUserWorkItem((c) => { throw new ApplicationException(“Test”); });

异步任务’堵塞’

最近我开始尝试大规模搜索一个网站用于存档目的,我认为让多个Web请求异步工作以加快速度是个好主意(10,000,000页对于存档来说肯定很多)所以我冒险进入三分钟之后,我开始想知道为什么我正在创建的任务(通过Task.Factory.StartNew )是“堵塞”。 懊恼和好奇我决定测试一下,看它是不是仅仅是因为环境的结果,所以我在VS2012中创建了一个新的控制台项目并创建了这个: static void Main(string[] args) { for (int i = 0; i { t.Stop(); Console.ForegroundColor = ConsoleColor.Green; //Note that the other tasks might manage to write their lines between these colour changes messing up the colours. Console.WriteLine(“Task ” + i2 + ” started after ” + t.Elapsed.Seconds + “.” + t.Elapsed.Milliseconds + “s”); […]