C# UI与后台线程死锁问题

在项目开发中,往往会遇到线程死锁问题。前几天,我也遇到了一个类似的问题,在这里与大家分享。 一、功能描述 原本程序只能自动刷新(其实就是每隔十秒钟查询访问数据库,得到数据),现在希望增加手动刷新共功能,保证用户使用的方便性和实时性。界面如下: 二、设计思路 为了保证自...

2019-04-05 09:20:18

阅读数 47

评论数 0

Linux 2. 关于pthread_cond_signal 唤醒两个线程的问题

这里贴出一个非常经典的关于多线程条件变量互斥锁的案例,即生产消费者模型。 我想说的是这里的while循环判断pthread_cond_wait,为何不能使用if的问题。 根据man查询到pthread_cond_signal这个函数至少会唤起1个线程,也就是说也有可能会唤起两个及以上个线程。因此,...

2017-06-05 10:20:30

阅读数 2219

评论数 4

Linux 1. 奇怪符号 ^@

最近一直在研究Linux操作,从内心来说,我觉得这个操作系统很有意思,而且拓宽了我局限于C#的思维模式,Tres bien! 学习过程中也遇到一些各种各样奇怪的问题,网上搜索后好像大家也没有一个确切的说法。因此在这里,我打算把我遇到的比较有意思的问题写在博客中,是自己的思考和实验,希望对大家有益。...

2017-06-03 11:11:52

阅读数 3559

评论数 0

【C#】63. 异步操作数据库 localDB

这篇不难,都是些基础性的异步操作,所以直接上代码。 可以参考里面的语法包括: 1)找到当前的bin文件夹: string outputFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 2)...

2016-12-13 15:27:21

阅读数 2118

评论数 0

【C#】62. 异步读写文件的几种方法: Task.Factory.FromAsync,WriteAsync

一、这里主要说明2种异步写入文件的方法: 1)异步编程模型API转为Task——使用Task.Factory.FromAsync方法 2)对于StreamWriter使用WriteAsync方法 请记得对stream对象使用FileOptions.Asynchronous选项! 首先来看一下准...

2016-12-13 14:38:23

阅读数 5145

评论数 1

【C#】61. 并行查询的异常处理 PLINQ Exception

本文主要是要说明PLINQ中如果发生了异常(除取消任务以外的异常),那么将会返回一个aggregateexception(因为所有并行查询中发生的异常都会被抛出),需要对其中的innerexception进行进一步处理。 首先来看普通Linq查询中发生的异常:由于是顺序执行查询,因此当碰...

2016-12-13 14:06:58

阅读数 757

评论数 0

【C#】60. PLINQ 的几个选项

本篇主要介绍在使用并行查询时的几个选项,包括指定并行度(WithDegreeOfParallelism)、是否强制使用并行执行模式(WithExecutionMode)、对于查询结果的合并选项(WithMergeOptions)以及取消选项(WithCancellation)。 static I...

2016-12-13 13:45:34

阅读数 341

评论数 0

【C#】59. AsParallel() 与 ForAll

平时经常会用到LINQ,这里介绍的方法可以有效地使用并行查询来加快查询速度(AsParallel),同时通过使用ForAll来对结果进行并行处理。 GetTpyes:通过反射,从当前Assembllies中的所有组件中找出名称以“Web”开头的类型名称。 static IEnumera...

2016-12-13 13:27:36

阅读数 3412

评论数 0

【C#】58. .Net中的并发集合——BlockingCollection

这篇是并发集合中的最后一篇,介绍一下BlockingCollection。在工作中我还没有使用过,但是看上去应该是为了便捷使用并发集合而创建的类型。默认情况下,BlockingCollection使用的是ConcurrentQueue容器,当然我们也可以使用其他实现了IProducerConsum...

2016-12-13 12:31:26

阅读数 2138

评论数 0

【C#】57. .Net中的并发集合——ConcurrentBag

这个是一个直接的爬虫可伸缩应用,虽然大致看明白了,但是真的用到实际中,如何处理超时和网络连接失败呢? Crawling类型:用于标示需要爬取的网页的URL,以及是由哪个爬虫找到的。 class Crawling { public string UrlToCrawl { get; set...

2016-12-13 11:15:44

阅读数 4305

评论数 0

【C#】56. .Net中的并发集合——ConcurrentStack

这篇其实和上一篇几乎一样,只是把ConcurrentQueue改为了ConcurrentStack,使用了Push(入)和TryPop(出)两个操作替代了Enqueue和TryDequeue。 static void Main(string[] args) { Task t = RunProgr...

2016-12-13 10:26:02

阅读数 1698

评论数 0

【C#】55. .Net中的并发集合——ConcurrentQueue

这部分内容我觉得可以用在网络爬虫之类的任务上,应该是很有启发的。 客户类型: class Custom { public int Id { get; set; } }“随机等待时间”任务: static Task GetRandomDelay() { int delay = new Rand...

2016-12-13 10:17:16

阅读数 6412

评论数 0

【C#】54. .Net中的并发集合——ConcurrentDictionary

转载自《C#多线程编程实例》 对于并行计算,我们需要使用适当的数据结构。这些结构具备可伸缩性,尽可能地避免锁,并且还能提供线程安全的访问。.Net Framework 引入了System.Collections.Concurrent 命名空间,包含了一些数据结构。 const string I...

2016-12-13 09:45:41

阅读数 4782

评论数 0

【C#】53. Async void VS Task

本文主要说明与Task或者Task相比,Async void为什么应该避免。 async static Task GetInfoAsync(string name, int seconds) { await Task.Delay(TimeSpan.FromSeconds(seconds)); if...

2016-12-12 22:57:57

阅读数 2731

评论数 0

【C#】52. 使用Flatten方法处理并行任务抛出的异常

本篇主要讨论一下InnerException的处理方法flatten。 async static Task GetInfoAsync(string name, int seconds) { await Task.Delay(TimeSpan.FromSeconds(seconds)); thro...

2016-12-12 22:20:23

阅读数 693

评论数 0

【C#】51. Await 处理并行任务(WhenAll)以及Task.Delay()

这篇文章主要说明两个问题:1、await如何替代ContinueWith来处理WhenAll之类的并行多任务;2、Task.Delay()的原理。 async static Task GetInfoAsync(string name, int seconds) { await Task.Delay...

2016-12-12 21:54:14

阅读数 5294

评论数 1

【C#】50.使用await操作连续的异步任务

本篇主要说明一下使用await处理连续异步任务后,程序的条理会变得较为清晰。 async static Task GetInfoAsync(string name) { Console.WriteLine("Task {0} started!", name); awa...

2016-12-12 21:13:55

阅读数 2042

评论数 0

【C#】49. async, await 基础

这篇文章主要介绍一下C# 5.0语法中的新组合:async 和 await。我这里主要会写一些基本的注意要点,但是不会过于仔细。 首先,必须要说明的是async和await是一对,要使用await关键字,那么函数前必须要有async前缀;这对语法糖不能使用在catch、finally、lock、...

2016-12-12 15:16:23

阅读数 1545

评论数 0

【C#】48. TaskScheduler

这篇其实很重要,讲了如何在UI线程和线程池线程之间通讯。一般来说,UI线程拥有的对象,其他线程是无法操作的。但是.Net有一个很重要的抽象对象——TaskScheduler(任务调度器)。它协调着不同任务(线程)的运行,使得线程池中的线程有了操作UI线程的可能。在我以前不知道Oberservabl...

2016-12-12 13:44:45

阅读数 5361

评论数 0

【C#】48. Task WhenAll、WhenAny 创建任务的任务

Task中有几个非常方便的并行运行任务的方式,比如WhenAll(当所有Task都运行完毕RanToCompletion)、WhenAny(只要有一个Task运行完毕)等等。本篇就来介绍一下WhenAll和WhenAny。 static int TaskMethod(string name, i...

2016-12-12 11:08:33

阅读数 6053

评论数 0

提示
确定要删除当前文章?
取消 删除
关闭
关闭