Tag: 任务

使用`async` lambda与`Task.Run()`冗余?

我刚刚遇到了一些代码: var task = Task.Run(async () => { await Foo.StartAsync(); }); task.Wait(); (不,我不知道Foo.StartAsync()的内部工作原理)。 我最初的反应是摆脱async / await并重写为: var task = Foo.StartAsync(); task.Wait(); 这是否正确(再一次,对Foo.StartAsync()一无所知)。 这个答案与它有什么不同 – 用Task.Run运行’异步’动作委托……似乎表明可能存在可能有意义的情况,但它也说“说实话,我没有”看到很多场景……“

如何处理Task.Runexception

我从Task.Run中捕获exception时遇到了问题。我更改了代码并解决了问题。 我愿意弄清楚在这两种方式下处理Task.Run中的exception有什么区别: 在Outside函数中我无法捕获exception但在Inside中我可以捕获它。 void Outside() { try { Task.Run(() => { int z = 0; int x = 1 / z; }); } catch (Exception exception) { MessageBox.Show(“Outside : ” + exception.Message); } } void Inside() { Task.Run(() => { try { int z = 0; int x = 1 / z; } catch (Exception […]

Task.WaitAll方法与Parallel.Invoke方法

我有示例代码来比较Parallel方法和Task方法的处理时间。 这个实验的目标是了解它们是如何工作的。 所以我的问题是: 为什么Parallel工作得比Task快? 我的结果是否意味着我应该使用Parallel而不是Task? 我应该在哪里使用Task和Parallel? 使用Task与Parallel相比有什么好处? Task只是ThreadPool.QueueUserWorkItem方法的包装吗? public Task SomeLongOperation() { return Task.Delay(3000); } static void Main(string[] args) { Program p = new Program(); List tasks = new List(); tasks.Add(Task.Factory.StartNew(() => p.SomeLongOperation())); tasks.Add(Task.Factory.StartNew(() => p.SomeLongOperation())); var arr = tasks.ToArray(); Stopwatch sw = Stopwatch.StartNew(); Task.WaitAll(arr); Console.WriteLine(“Task wait all results: ” + sw.Elapsed); sw.Stop(); sw = […]

IO绑定操作的并行执行

我已阅读TPL和任务库文档封面。 但是,我仍然无法清楚地理解以下情况,现在我需要实施它。 我会简化我的情况。 我有一个长度为1000的IEnumerable 。我必须使用HttpClient向它们发出请求。 我有两个问题。 没有太多计算 ,只是在等待Http请求。 在这种情况下,我还可以使用Parallel.Foreach()吗? 如果使用Task ,创建大量的最佳实践是什么? 假设我使用Task.Factory.StartNew()并将这些任务添加到列表中并等待所有这些任务。 是否有一个function(如TPL分区程序)控制最大任务的数量和我可以创建的最大HttpClient ? 在SO上有几个类似的问题,但没有人提到最大值 。 该要求仅使用具有最大HttpClient的最大任务。 先感谢您。

如何根据最佳实践在C#4中创建异步方法?

请考虑以下代码段: public static Task FetchAsync() { string url = “http://www.example.com”, message = “Hello World!”; var request = (HttpWebRequest)WebRequest.Create(url); request.Method = WebRequestMethods.Http.Post; return Task.Factory.FromAsync(request.BeginGetRequestStream, request.EndGetRequestStream, null) .ContinueWith(t => { var stream = t.Result; var data = Encoding.ASCII.GetBytes(message); Task.Factory.FromAsync(stream.BeginWrite, stream.EndWrite, data, 0, data.Length, null, TaskCreationOptions.AttachedToParent) .ContinueWith(t2 => { stream.Close(); }); }) .ContinueWith(t => { var t1 = […]

中继命令可以执行和任务

我想在调用relay命令时启动任务,但是只要该任务正在运行,我想禁用该按钮 举个例子 private ICommand update; public ICommand Update { get { if (update == null) { update = new RelayCommand( param => Task.Factory.StartNew(()=> StartUpdate()), param => true); //true means the button will always be enabled } return update; } } 检查该任务是否正在运行的最佳方法是什么? 这是我的解决方案,但不确定它是否是最佳方式 class Vm : ObservableObject { Task T; public Vm() { T = new […]

如何在不阻止UI的情况下等待线程完成

我希望我的程序在下面的行之后等待 frmProgressBarObj = PullMSI.ExtractByMSIName(“products.txt”, false); 如上所述,方法是通过StartProcessWithProgress()方法在内部调用线程。 我希望在执行代码逻辑-2行之前完成该线程。 同时,它不应该停止由frmProgressBar.UpdateProgress()完成UI更新。 我该怎么做呢? namespace NS1 { public partial class frmMain : Form { private void button1_Click(object sender, EventArgs e) { frmProgressBar frmProgressBarObj = PullMSI.ExtractByMSIName(“products.txt”, false); //code logic – 2 MessageBox.Show(“This is executing immediately. I want to wait until above thread is complete”); } } public partial class frmProgressBar : […]

如何等待有条件的任务?

我有一些任务返回一个布尔。 我只想等到任何任务首先返回True时。 可能吗 ? 我的第一个想法是使用CancellationTokenSource,但它不是一个好主意,因为它在我调用Task.WaitAll方法时抛出exception。 第二个选项是使用我在参考中传递的bool,如果是,则直接返回。 它有效,但它不是高效的: bool isFound = false; Task t0 = Task.Factory.StartNew(() => Find(paramA, paramB, ref isFound)); Task t1 = Task.Factory.StartNew(() => Find(paramC, paramD, ref isFound)); Task t2 = Task.Factory.StartNew(() => Find(paramE, paramF, ref isFound)); Task t3 = Task.Factory.StartNew(() => Find(paramG, paramH, ref isFound)); Task.WaitAll(new Task[] { t0, t1, t2, t3, t4 […]

如何在异步方法中向UI提供反馈?

我一直在开发一个Windows表单项目,我有10个任务要做,我想以async方式执行此操作。 当用户单击按钮并且我调用async方法执行此操作时,这些任务将会出现。 在我的代码中,我已经有了这些进程的参数列表。 我的问题是: A)如何转换我的代码并行运行所有进程? (我想实现async / await) B)如何向我的UI应用程序提供反馈? 下面的代码是我试过的: 我的按钮调用方法来启动进程 private void button1_Click(object sender, EventArgs e) { // almost 15 process foreach (var process in Processes) { // call a async method to process ProcessObject(process); } } 模拟我的进程获取参数的方法 private async void ProcessObject(ProcessViewModel process) { // this is my loop scope, which I need to […]

VS2013调试/ Windows /任务:“没有要显示的任务”

我有Visual Studio Professional 2013,我正在调试一个广泛使用async / await的应用程序。 但是当我在断点处停止并打开Debug / Windows / Tasks窗口时,它总是说“没有要显示的任务”。 我做了两个测试,在一个我可以看到任务,在另一个我不能(我运行程序,并暂停它)。 或者我可以在等待任务线时断点。 using System; using System.Threading; using System.Threading.Tasks; namespace TasksDebugWindowTest { class Program { static void Main(string[] args) { DoesNotWork(); } static void Works() { Console.WriteLine(“Starting”); var t = Task.Factory.StartNew(() => { Task.Delay(100 * 1000).Wait(); Console.WriteLine(“Task complete”); }); Console.WriteLine(“Status: {0}”, t.Status); Thread.Sleep(500); Console.WriteLine(“Status: {0}”, […]