C#人爱学不学
文章平均质量分 80
茗杨AaronYang
胖乎乎的,但技术还好
展开
-
[AaronYang]C#人爱学不学22 - 线程同步和锁
多个线程同时访问共享数据的时候,线程同步能够防止线程损坏。之所以强调同时,是因为线程同步问题其实就是访问时间问题。如果有些数据会被多个线程访问,但是这几个线程访问的时间都是错开的,不会同时接触到数据,那完全就用不到线程同步。线程同步会遇到几个问题,所以能避免使用就别用:使用繁琐,容易出错:你需要清楚的明白哪些数据可能是会被同时访问的,然后用一个锁锁住它,确保一次只有一个线程能够访问。如果任何一块数据被漏了,那就会有问题。没法确定你所有用锁的方式一定正确:只能靠测试和经验。原创 2023-11-24 23:53:05 · 108 阅读 · 0 评论 -
[AaronYang]C#人爱学不学23 -websocket-sharp
新建文件夹,git cloneMIT许可websocket-sharp 支持:RFC 6455WebSocket 客户端和服务器Per-message压缩扩展安全连接HTTP 身份验证查询字符串、Origin 标头和 Cookie通过 HTTP 代理服务器连接.NET Framework 3.5 或更高版本(包括兼容环境,例如 Mono)新建2个wpf项目nuget引用示例1创建server端,方便测试。原创 2023-11-22 09:12:07 · 252 阅读 · 0 评论 -
[AaronYang]C#人爱学不学21- 一些锁
为什么说它是轻量级呢?因为它仅对整形数据(即int类型,long也行)进行同步。具体使用如下表:Interlocked.Increment(ref value)数值加一(原子性操作)Interlocked.Decrement(ref value)数值减一(原子性操作)Interlocked.Exchange(ref value1, value2)交换:把值2赋给值1;返回新值。原创 2023-11-22 09:10:49 · 70 阅读 · 0 评论 -
[AaronYang]C#人爱学不学20-MEF
4.0 以后引入了MEF应用/插件均使用约定好的协议(接口)进行开发。系统将自动扫描指定文件夹,并按协议自动导入。项目添加System.ComponentModel.Composition.dll在任意地方Export导出一个类型,在任意地方可以导入 Import类型,如上,我们使得接口具有示例了。using ILog;set;pro.Run();void Run()CurrentLogService.Log("MEF日志测试通过");原创 2023-11-22 09:08:51 · 106 阅读 · 0 评论 -
[AaronYang]C#人爱学不学18-IEnumerable的场景说明
4.如果返回的集合要支持索引,但不能添加,删除元素,用ReadOnlyCollection<T>1.如果你返回的集合是只用于遍历,不可修改的,则返回IEnumerable<T>2.如果返回的集合需要修改,如添加和删除元素,用ICollection<T>3.如果返回的集合需要支持排序,索引等,用IList<T>原创 2023-11-16 11:48:02 · 66 阅读 · 0 评论 -
[AaronYang]C#人爱学不学17- 文件夹操作
要删除的文件夹目录原创 2023-11-24 23:52:23 · 85 阅读 · 0 评论 -
[AaronYang]C#人爱学不学16-创建快捷方式
MsiHelper.CreateDesktopLink(你的文本, string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, AppDomain.CurrentDomain.FriendlyName), string.Format("{0}", AppDomain.CurrentDomain.BaseDirectory), 启动参数, desc);原创 2023-11-22 09:08:14 · 150 阅读 · 0 评论 -
[AaronYang]C#人爱学不学15- Semphore
Console.WriteLine(thrd.Name + "正在等待一个许可证……Console.WriteLine(thrd.Name + "申请到许可证……Console.WriteLine(thrd.Name + " 释放许可证……//创建一个可授权2个许可证的信号量,且初始值为2。// //这就是说除了调用该信号量的线程都将被阻塞。// //我设置一个最大允许5个线程允许的信号量。// //并将它的计数器的初始值设为0。原创 2023-11-22 09:07:58 · 44 阅读 · 0 评论 -
[AaronYang]C#人爱学不学14- volatile
换句话说,另一个线程可能已经改 变了它线程内的i1值,而这个值可以和当前线程中的i1值不相同。因此实际上存在一种可能:“主”内存区域里的i1值是1,线程1里的i1值 是2,线程2里的i1值是3——这在线程1和线程2都改变了它们各自的i1值,而且这个改变还没来得及传递给“主”内存区域或其他线程时就会发生。volatile是C#中用于控制同步的关键字,其意义是针对程序中一些敏感数据,不允许多线程同时访问,保证数据在任何访问时刻,最多有一个线程访问,以保证数据的完整性,volatile是修饰变量的修饰符。原创 2023-11-21 09:03:17 · 74 阅读 · 0 评论 -
[AaronYang]C#人爱学不学13- DebuggerStepThrough
C#中可能会用到这个。原创 2023-11-21 09:02:38 · 74 阅读 · 0 评论 -
[AaronYang]C#人爱学不学12- dynamic
声明个复杂的dynamic类型然后随便赋值属性和方法上节课我们使用了IServices.IPayService pay = (IServices.IPayService)System.Activator.CreateInstance(item, "京东支付", "ayBuy", "ayBus", 100.00M, DateTime.Now, "http://www.ayjs.net/rest/no1", "http://www.ayjs.net/rest/nocomplete");原创 2023-11-21 09:02:07 · 77 阅读 · 0 评论 -
[AaronYang]C#人爱学不学11-反射加载dll的demo
Load方法:CLR通过调用System.Rreflection.Assemblly类的静态方法来显示加载程序集。LoadFrom方法:此方法首先打开程序集,并通过 public static AssemblyName GetAssemblyName(string assemblyFile);方法提取到程序集名称,然后再使用Load方法加载程序集。ReflectionOnlyLoad方法:加载程序集,只是获取程序集的相关信息。但CLR禁止此程序集中的代码执行。原创 2023-11-20 10:54:51 · 192 阅读 · 0 评论 -
[AaronYang]C#人爱学不学10-并行编程3- WhenAny
问题:在默认情况下,一个async方法在被await调用后恢复运行时,会在原来的上下文中运行,如果是UI上下文,并且有大量的async方法在UI上下文中恢复,就会引起性能上的问题。这里虽然foreach时候,是按照列表的顺序进行await,但是执行顺序也未知,但是我们希望按任务完成的次序进行处理,不必等待其他任务,我们想到了可以用WhenAll。处理async Task方法的异常,在async Task方法中引发的异常,存放在返回的task对象中。如果可能的话,方法的方法类型不要用void,改为Task。原创 2023-11-20 10:53:45 · 158 阅读 · 0 评论 -
[AaronYang]C#人爱学不学9-并行编程2 - WhenAll
而在另一个线程上 rtb在当前的线程环境,是找不到的,所以又只能通过Dispatcher.BeginInvoke讲UI更新任务放在UI任务队列上,让系统自己更新。多任务完成--- WhenAll 一组任务完成,所有任务完成时候返回一个Task对象,如果多个任务返回类型一样,则返回每个任务执行结果的数组。由于rtb在UI线程上,我又不想耗时操作在UI线程,所以只能用Task.Run(()=>{ })同理,我们再写捕捉多个错误的,就是在异常的地方,合并错误。//所有任务开始执行。原创 2023-11-20 10:53:29 · 94 阅读 · 0 评论 -
[AaronYang]C#人爱学不学8-异步接口与.net4.5的进度报告
如果要让返回的task对象有一个其他类型的结果(例如NotImplementedException结束的Task对象),就得自行创建使用TaskCompletionSource的辅助方法。调用的时候,这里没有用Task.Run了,因为StartWork中用到了UI线程的东西pb_ayjs_1,就是进度条,如果使用了Task.Run,就会报错,说对象被某某线程占用。TaskCompletionSource<T>类有很多Task的返回方式,FromResult<T>是它其中的一个简写。原创 2023-11-20 10:52:19 · 85 阅读 · 0 评论 -
[AaronYang]C#人爱学不学7- 并行编程1
// 同时进行任务,一个3秒延迟任务,一个下载任务,谁先完成,返回谁,如果3秒延迟任务先完成,则返回null,要不然返回下载任务。当然这里模拟延迟的,我们稍微真的延迟试下,下载个东西,引入using System.Net.Http;效果不展示了,例如如果uri是facebook,就会返回空白的弹出框,如果3秒内可以响应的网站,就会返回源码。果然是的,而且界面没有卡哦。//尝试下载时间间隔,第一次1秒,第二次2秒,第三次4秒。这里主要简单学习Task.WhenAny,多个任务进行,如果谁完成,先返回谁。原创 2023-11-20 10:51:08 · 78 阅读 · 0 评论 -
[AaronYang]C#人爱学不学6-C#5.0异步实例+WPF自己的MVVM Async应用
Button Content="导入数据" HorizontalAlignment="Left" Command="{Binding ImportDataCommand}" Margin="133,32,0,0" VerticalAlignment="Top" Width="190" Height="26"/>在构造函数中,绑定对应的实现,由于对应的ViewModel无法拿到window的控件,为了让最终值的文本显示,我们需要添加一个自动通知的属性。如果你要进行的操作不支持await修饰怎么办?原创 2023-11-20 10:50:45 · 316 阅读 · 0 评论 -
[AaronYang]C#人爱学不学5-WeakReference
region 注意这里的代码 如果屏蔽了 就是全部是 yes 没有 就有50%的yes。原创 2023-11-17 10:43:56 · 84 阅读 · 0 评论 -
[AaronYang]C#人爱学不学4-事件和.net4.5的弱事件
没有伟大的愿望,就没有伟大的天才。原创 2023-11-17 10:41:59 · 77 阅读 · 0 评论 -
[AaronYang]C#人爱学不学3-委托
1.1 委托:面试我都会说,把方法当参数。委托包含的只是一个或多个方法的地址。示例1:(一次执行多个同方法签名的方法)/**2015年1月3日23:12:13 aaronyang*网址:www.ayjs.net www.8mi.me*///第一步delegate 方法签名 定义个方法的样子,如同接口//或者 非常建议 直接 +=或者=tm(2);//一次性执行3个方法//或者使用Invoke方法效果:示例2:委托类型的数组。原创 2023-11-17 10:41:07 · 76 阅读 · 0 评论 -
[AaronYang]C#人爱学不学[2]
不要回头,不要将就,做到这两点,人生就会简单很多幸福很多 -原创 2023-11-17 10:39:36 · 64 阅读 · 0 评论 -
[AaronYang]C#人爱学不学[1]
这里的string很特殊,是个引用类型,比如2个string 同时引用一个string地址,当s1修改值时候,s2没有变化,因为修改一个字符串,就会创建一个全新的string对象,不信可以运行下面例子。当然还有其他形式,不具体介绍了,虽然你看似没用,但是 举个实际案例:项目持续发布软件,都是自己拉取svn代码,然后自动编译,或者网页上开发人员自己点编译,现在觉得还没用吗?值类型存储在堆栈中,存储值,而引用类型存储在托管堆上,简称堆上,存储引用地址。只能访问类的静态成员,不能访问类的实例成员。原创 2023-11-17 10:38:58 · 71 阅读 · 0 评论