- 博客(29)
- 资源 (8)
- 收藏
- 关注
转载 【C#】63. 异步操作数据库 localDB
这篇不难,都是些基础性的异步操作,所以直接上代码。可以参考里面的语法包括:1)找到当前的bin文件夹:string outputFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);2)调用数据库的自带procedure(这里是detach)并且传参:Console.WriteLin
2016-12-13 15:27:21 3829
转载 【C#】62. 异步读写文件的几种方法: Task.Factory.FromAsync,WriteAsync
一、这里主要说明2种异步写入文件的方法:1)异步编程模型API转为Task——使用Task.Factory.FromAsync方法2)对于StreamWriter使用WriteAsync方法请记得对stream对象使用FileOptions.Asynchronous选项!首先来看一下准备函数:CreateFileContent是用来随机生成要写入的内容(字符串形式);
2016-12-13 14:38:23 10388 1
转载 【C#】61. 并行查询的异常处理 PLINQ Exception
本文主要是要说明PLINQ中如果发生了异常(除取消任务以外的异常),那么将会返回一个aggregateexception(因为所有并行查询中发生的异常都会被抛出),需要对其中的innerexception进行进一步处理。首先来看普通Linq查询中发生的异常:由于是顺序执行查询,因此当碰到了对应的第一个异常时便自动捕获,也无须考虑线程的问题,因为是在同一个线程中。IEnumerabl
2016-12-13 14:06:58 1155
转载 【C#】60. PLINQ 的几个选项
本篇主要介绍在使用并行查询时的几个选项,包括指定并行度(WithDegreeOfParallelism)、是否强制使用并行执行模式(WithExecutionMode)、对于查询结果的合并选项(WithMergeOptions)以及取消选项(WithCancellation)。static IEnumerable GetTypes(){return from assembly in App
2016-12-13 13:45:34 577
转载 【C#】59. AsParallel() 与 ForAll
平时经常会用到LINQ,这里介绍的方法可以有效地使用并行查询来加快查询速度(AsParallel),同时通过使用ForAll来对结果进行并行处理。GetTpyes:通过反射,从当前Assembllies中的所有组件中找出名称以“Web”开头的类型名称。static IEnumerable GetTypes(){return from assembly in AppDomain.
2016-12-13 13:27:36 10198
转载 【C#】58. .Net中的并发集合——BlockingCollection
这篇是并发集合中的最后一篇,介绍一下BlockingCollection。在工作中我还没有使用过,但是看上去应该是为了便捷使用并发集合而创建的类型。默认情况下,BlockingCollection使用的是ConcurrentQueue容器,当然我们也可以使用其他实现了IProducerConsumerCollection的类型来操作。static Task GetRandomDelay(){
2016-12-13 12:31:26 5287
翻译 【C#】57. .Net中的并发集合——ConcurrentBag
这个是一个直接的爬虫可伸缩应用,虽然大致看明白了,但是真的用到实际中,如何处理超时和网络连接失败呢?Crawling类型:用于标示需要爬取的网页的URL,以及是由哪个爬虫找到的。class Crawling{public string UrlToCrawl { get; set; }public string ProducerName { get; set; }}
2016-12-13 11:15:44 7298
翻译 【C#】56. .Net中的并发集合——ConcurrentStack
这篇其实和上一篇几乎一样,只是把ConcurrentQueue改为了ConcurrentStack,使用了Push(入)和TryPop(出)两个操作替代了Enqueue和TryDequeue。static void Main(string[] args){Task t = RunProgram();t.Wait();Console.Read();}static async Tas
2016-12-13 10:26:02 3938
翻译 【C#】55. .Net中的并发集合——ConcurrentQueue
这部分内容我觉得可以用在网络爬虫之类的任务上,应该是很有启发的。客户类型:class Custom{public int Id { get; set; }}“随机等待时间”任务:static Task GetRandomDelay(){int delay = new Random(DateTime.Now.Millisecond).Next(1, 500);return T
2016-12-13 10:17:16 8639
转载 【C#】54. .Net中的并发集合——ConcurrentDictionary
转载自《C#多线程编程实例》对于并行计算,我们需要使用适当的数据结构。这些结构具备可伸缩性,尽可能地避免锁,并且还能提供线程安全的访问。.Net Framework 引入了System.Collections.Concurrent 命名空间,包含了一些数据结构。const string Item = "Dictionary item";public static string Curre
2016-12-13 09:45:41 6569
转载 【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(name.Contains("Exception")) throw new Exceptio
2016-12-12 22:57:57 6483
翻译 【C#】52. 使用Flatten方法处理并行任务抛出的异常
本篇主要讨论一下InnerException的处理方法flatten。async static Task GetInfoAsync(string name, int seconds){await Task.Delay(TimeSpan.FromSeconds(seconds));throw new Exception(string.Format("Boom from {0}!", nam
2016-12-12 22:20:23 1172
翻译 【C#】51. Await 处理并行任务(WhenAll)以及Task.Delay()
这篇文章主要说明两个问题:1、await如何替代ContinueWith来处理WhenAll之类的并行多任务;2、Task.Delay()的原理。async static Task GetInfoAsync(string name, int seconds){await Task.Delay(TimeSpan.FromSeconds(seconds));//await Task.Run(
2016-12-12 21:54:14 8564 1
原创 【C#】50.使用await操作连续的异步任务
本篇主要说明一下使用await处理连续异步任务后,程序的条理会变得较为清晰。async static Task GetInfoAsync(string name){Console.WriteLine("Task {0} started!", name);await Task.Delay(2000);if(name == "Async 2")throw new Exceptio
2016-12-12 21:13:55 3621
原创 【C#】49. async, await 基础
这篇文章主要介绍一下C# 5.0语法中的新组合:async 和 await。我这里主要会写一些基本的注意要点,但是不会过于仔细。首先,必须要说明的是async和await是一对,要使用await关键字,那么函数前必须要有async前缀;这对语法糖不能使用在catch、finally、lock、unsafe代码中;且函数参数不能有out或者ref修饰;异步函数必须返回Task或者Task类型。
2016-12-12 15:16:23 1991
原创 【C#】48. TaskScheduler
这篇其实很重要,讲了如何在UI线程和线程池线程之间通讯。一般来说,UI线程拥有的对象,其他线程是无法操作的。但是.Net有一个很重要的抽象对象——TaskScheduler(任务调度器)。它协调着不同任务(线程)的运行,使得线程池中的线程有了操作UI线程的可能。在我以前不知道OberservableCollection和WPF开发的时候,都是要么使用 Invoke方法,要么就是使用TaskSche
2016-12-12 13:44:45 8493
原创 【C#】48. Task WhenAll、WhenAny 创建任务的任务
Task中有几个非常方便的并行运行任务的方式,比如WhenAll(当所有Task都运行完毕RanToCompletion)、WhenAny(只要有一个Task运行完毕)等等。本篇就来介绍一下WhenAll和WhenAny。static int TaskMethod(string name, int seconds){Console.WriteLine("Task {0} 运行在线程 {1}
2016-12-12 11:08:33 11865
原创 【C#】47. Task 的异常处理
就像在讨论线程的时候我们说过,要在线程调用的函数里面做try catch处理,如果在其他线程中使用try catch是无法正常捕获异常。Task也一样,基本原理就是一个线程没办法捕获另一个线程的异常。static int TaskMethod(string name, int seconds){Console.WriteLine("Task {0} 运行在线程 {1} 上。是否是线程池线程
2016-12-12 10:34:49 9464
原创 【C#】46. 使用CancellationTokenSource 取消 Task
本篇的内容也很重要,因为涉及到了日常经常会碰到的取消任务操作。从我个人了解到的情况,基本上大家都采用CancellationTokenSource方法来取消任务,因此这里就举几个简单的例子。例子依然是来自于《C#多线程编程实战》。private static int TaskMethod(string name, int seconds, CancellationToken token)
2016-12-12 10:03:52 18956
原创 【C#】45. Task ContinueWith 后续操作
本章内容其实挺重要的,但是现在我工作中还没怎么遇到,应该是我还没想到的关系吧~ContinueWith是Task根据其自身状况,决定后续应该作何操作。也就是说,在运行完task后,会执行task.continuewith(XX)中的XX语句,但是是否执行、如何执行等需要看task的运行情况。static int TaskMethod(string name, int seconds)
2016-12-11 22:23:08 23617 3
原创 【C#】44. Task<T> 根据带返回值的函数构造Task
上篇中,我们看了不带参数值和返回值的函数(Action)构造Task的方法,本篇中我们想Thread一样,看看如何给Task传参和返回值。首先定义int TaskMethod(String)函数,该函数以String作为参数,返回Int类型结果:static int TaskMethod(string name){Console.WriteLine("Task {0} 运行在线程id为
2016-12-11 21:23:12 38386 1
原创 【C#】43. TPL基础——Task初步
从这篇文章开始,我想直接进入关于Task的一些内容,有时间再回顾Threadpool的相关内容。我一开始接触Task就觉得他和Thread很像,都是开新的线程。但是两者有很多区别,其中比较明显的是:Task创建的是线程池任务,而Thread默认创建的是前台任务。 同Thread一样,Task可以使用lambda表达式来构造action,作为Task的构造函数参数。如下:1
2016-12-11 20:56:10 2774 3
原创 【C#】42. 在线程中使用Try Catch
本文主要说明:在线程函数中使用Try Catch能够正确捕获异常,而如果使用形如 try { var t = New Thread(XX); t.start(); } Catch{} 这种代码是无法正确处理异常的。using System;using System.Threading;namespace Chapter1.Recipe11{ class Program {
2016-12-11 18:19:21 3264
原创 【C#】41. 线程中使用lock
锁的内容很重要,首先必须明确,只有用到使用相同变量时,会发生竞争。如果线程操作的是不同实例,那么不会发生影响。以下代码先构造一个抽象类CounterBase,里面说明所有其子类必须Increment()和Decrement()两个方法。其子类有两个:Counter和CounterWithLock。比较有意思的是两者都用的是Count属性(private set),估计是可以生成默认的内部变量。
2016-12-11 18:09:29 427
原创 【C#】40. 线程参数传递的三种方法
本文主要介绍三种向线程传递参数的方法,使用的例子依然是《C#多线程编程实例》。这三种方法分别是:1、写一个类型,在构造函数中传参,而后在类型中写无参数函数,里面使用内部变量,从而达到传参的目的。2、使用lambda方法,通过直接调用已有的带参数函数,通过lambda表达式向线程传参。3、使用thread.start(object parameter)的方法。其中,第二种方法与第一种方法其实
2016-12-11 17:36:28 6183
原创 【C#】39. 前台线程与后台线程
这篇文章主要介绍一下前台线程后后台线程的区别:进程会等待前台线程结束后才能结束,而不会理会后台线程的执行状况。显示创建的线程默认情况下都是前台线程,除非手动设置 IsBackground = True。using System;using System.Threading;namespace Chapter1.Recipe7{class Program{static vo
2016-12-11 15:33:08 1327
原创 【C#】38. 线程的等待方法:join
其实多线程最复杂的地方在于不同线程间的同步问题,这其中会涉及到先后执行问题、共享变量问题等。这篇文章我们主要来开个头,看一下join方法。using System;using System.Threading;namespace Chapter1.Recipe3{class Program{static void Main(string[] args){Console.Wri
2016-12-11 14:38:52 6421
原创 【C#.37】多线程中的Sleep以及子线程优先级
继续上篇,其实在写文章的过程中真的实践了不少,而且发现和自己原来认为的有挺多不同的。因此有错误的话请多指正。以下的内容都是经过试验得出的:using System;using System.Threading;namespace Chapter1.Recipe2{class Program{static void Main(string[] args){Thread
2016-12-11 14:00:17 12791
rpi-apache-hive-3.1.2-src.tar.gz
2020-07-13
rpi-hadoop-3.2.1.tar.gz
2020-07-08
rpi-hadoop-3.2.1-src.tar.gz
2020-07-06
树莓派 4 B hadoop编译文件下载 hadoop-3.2.1.tar.gz
2020-07-06
Visual Studio 2010 Tools for Office Runtime 10.0.40303.0
2017-11-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人