Tag: 任务并行库

在TPL中中止长时间运行的任务

我们的应用程序使用TPL来序列化(可能)长时间运行的工作单元。 工作(任务)的创建是用户驱动的,可以随时取消。 为了拥有响应式用户界面,如果不再需要当前的工作,我们想放弃我们正在做的事情,并立即开始一项不同的任务。 任务排队等同于: private Task workQueue; private void DoWorkAsync (Action callback, CancellationToken token) { if (workQueue == null) { workQueue = Task.Factory.StartWork (() => DoWork(callback, token), token); } else { workQueue.ContinueWork(t => DoWork(callback, token), token); } } DoWork方法包含一个长时间运行的调用,因此它不像持续检查token.IsCancellationRequested的状态那样简单,如果/当检测到取消时, token.IsCancellationRequested 。 长时间运行的工作将阻止任务继续,直到它完成,即使任务被取消。 我已经提出了两个样本方法来解决这个问题,但我不相信这两种方法都是正确的。 我创建了简单的控制台应用程序来演示它们如何工 需要注意的重要一点是, 在原始任务完成之前会继续触发 。 尝试#1:内部任务 static void Main(string[] args) { CancellationTokenSource cts […]

使用Task.Factory.StartNew时更新UI标签

我试图在我的WPF应用程序中使我的UI更具响应性。 我使用生成一个新线程 Task.Factory.StartNew( () => RecurseAndDeleteStart() ); 在该方法RecurseAndDeleteStart()我想使用正在删除的文件更新UI中的标签。 如何实现这一目标?

调用基于异步任务的WCF方法是否利用I / O完成端口或线程池线程来调用延续?

我有以下WCF合同: [ServiceContract(Namespace = “http://abc/Services/AdminService”)] public interface IAdminService { [OperationContract] string GetServiceVersion(); // More methods here } GetServiceVersion是一个返回一些字符串的简单方法。 它用作ping来检查服务是否可访问。 现在我想异步调用它,认为它比使用.NET线程在后台调用它更有效。 所以,我为此提出了以下接口: [ServiceContract(Namespace = “http://abc/Services/AdminService”)] public interface IMiniAdminService { [OperationContract(Action = “http://abc/Services/AdminService/IAdminService/GetServiceVersion”, ReplyAction = “http://abc/Services/AdminService/IAdminService/GetServiceVersionResponse”)] Task GetServiceVersionAsync(); } 这使得可以异步调用GetServiceVersion API: var tmp = new ChannelFactory(“AdminServiceClientEndpoint”); var channelFactory = new ChannelFactory(tmp.Endpoint.Binding, tmp.Endpoint.Address); var miniAdminService = channelFactory.CreateChannel(); return miniAdminService.GetServiceVersionAsync().ContinueWith(t […]

使用异步调用时exception处理的良好模式

我想使用Web API,我看到很多人推荐System.Net.Http.HttpClient 。 那很好……但我只有VS-2010,所以我还不能使用async/await 。 相反,我想我可以将Task组合使用到ContinueWith 。 所以我尝试了这段代码: var client = new HttpClient(); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue(“application/json”)); client.GetStringAsync(STR_URL_SERVER_API_USERS).ContinueWith(task => { var usersResultString = task.Result; lbUsers.DataSource = JsonConvert.DeserializeObject<List>(usersResultString); }); 我的第一个观察是认识到如果URL不可用它不会产生任何错误,但可能会有更多这样的错误…… 所以我试图找到一种方法来处理这种异步调用的exception(特别是对于HttpClient)。 我注意到“任务”有IsFaulted属性和AggregateException可能会被使用,但我不确定如何。 另一个观察是GetStringAsync返回Task ,但GetAsync返回Task 。 后者可能更有用,因为它提供了一个StatusCode 。 您能否共享一个关于如何正确使用异步调用并以良好方式处理exception的模式? 基本的解释也将受到赞赏。

转向异步套接字并行,不仅仅是在使用TPL的非常密集的应用程序中并发

我正在编写一个使用Socket的应用程序,它将非常密集,然后我真的需要使用我们在大服务器中的每个核心。 我看到问题( 如何使用ThreadPool运行套接字线程并行? )这里在stackoverflow中只有一个答案指向此MSDN示例 。 但我认为它只指向如何使它并发而不是并行 ,这里有人问如何cpu密集是打开一个套接字 ,它看起来非常密集,有人告诉它不帮助TPL TaskFactory.FromAsync vs任务与阻止方法和某人在这里教会如何使用TaskFactory.FromAsync( 是否存在将现有的BeginXXX / EndXXX异步方法包装成异步任务的模式? )。 如何保持套接字操作并行和高性能,如果处理插槽问题,如断开连接,半连接套接字和消息边界是正常异步方式的头疼。 如果将TPL和Task放在一起,如何处理它。

如何在lambda表达式中捕获外部变量的值?

我刚刚遇到以下行为: for (var i = 0; i { Debug.Print(“Error: ” + i.ToString()); }); } 将导致一系列“错误:x”,其中大多数x等于50。 同理: var a = “Before”; var task = new Task(() => Debug.Print(“Using value: ” + a)); a = “After”; task.Start(); 将导致“使用价值:之后”。 这显然意味着lambda表达式中的串联不会立即发生。 在声明表达式时,如何在lambda表达式中使用外部变量的副本? 以下内容不会更好(我承认这不一定是不连贯的): var a = “Before”; var task = new Task(() => { var a2 = a; Debug.Print(“Using […]

为什么这个Parallel.ForEach代码会冻结程序?

更多新手问题: 这段代码从主窗口的列表中抓取了许多代理(我无法弄清楚如何在不同的函数之间使变量可用)并检查每个代理(简单的httpwebrequest),然后将它们添加到名为的列表中finishedProxies。 出于某种原因,当我按下开始按钮时,整个程序挂起。 我的印象是Parallel为每个动作创建单独的线程,只留下UI线程,以便它具有响应性? private void start_Click(object sender, RoutedEventArgs e) { // Populate a list of proxies List proxies = new List(); List finishedProxies = new List(); foreach (string proxy in proxiesList.Items) { proxies.Add(proxy); } Parallel.ForEach(proxies, (i) => { string checkResult; checkResult = checkProxy(i); finishedProxies.Add(checkResult); // update ui /* status.Dispatcher.Invoke( System.Windows.Threading.DispatcherPriority.Normal, new Action( delegate() { […]

并行执行任务

好吧,基本上我有一堆任务(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 […]

在WPF应用程序中执行后台任务

例 private void Start(object sender, RoutedEventArgs e) { int progress = 0; for (;;) { System.Threading.Thread.Sleep(1); progress++; Logger.Info(progress); } } 如果我想要Start(),推荐的方法是什么(TAP或TPL或BackgroundWorker或Dispatcher或其他) 不要阻止ui线程 可以提供进度报告 可以取消 支持multithreading和多核