随笔 - 339  文章 - 8 评论 - 499 trackbacks - 19
<2012年1月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

公告:发表时间超过两个月的随笔的源码一般都被删除了,请勿留言索取。

昵称:天方
园龄:6年1个月
粉丝:26
关注:1

搜索

 
 

常用链接

最新随笔

随笔分类

随笔档案

文章分类

.net学习

最新评论

阅读排行榜

评论排行榜

推荐排行榜

摘要: 最近发现手机的时间不是很准了,便到网上下了一个同步时间的小程序,简单了看了一下它的原理,是通过NTP协议来实现校时的,就顺便学习了一下NTP协议,用C#写了个简单的实现。 NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步。阅读全文
posted @ 2011-12-20 13:29 天方 阅读(61) 评论(0) 编辑

猜数字的算法的一个简单实现,用的最简单的算法,权当编程练习。

 1     class GuessNumber
 2     {
 3         public static IEnumerable<int> Guess(Func<intint> testHanlder)
 4         {
 5             var validNumers = Enumerable.Range(19);    //有效数字范围为1-9
 6             var candicateNum = from n1 in validNumers
 7                                from n2 in validNumers
 8                                from n3 in validNumers
 9                                from n4 in validNumers
10                                where new int[] { n1, n2, n3, n4 }.Distinct().Count() == 4    //过滤掉有重复的数字
11                                select n1 * 1000 + n2 * 100 + n3 * 10 + n4;
12 
13             while (true)
14             {
15                 var num = candicateNum.First();
16                 yield return num;
17 
18                 var result = testHanlder(num);
19                 if (result == 40)
20                     yield break;
21 
22                 candicateNum = candicateNum.Where(i => Test(i, num) == result);
23             }
24         }
25 
26         public static IEnumerable<int> Guess(int num)
27         {
28             return Guess(i => Test(i, num));
29         }
30         
31         //为了简单返回值为int型,如2A1B则返回21
32         public static int Test(int num1, int num2)
33         {
34             var value1 = num1.ToString("0000");
35             var value2 = num2.ToString("0000");
36 
37             Contract.Assume((value1.Length == 4) && (value2.Length == 4));
38 
39             var query = value1.Zip(value2, (ch1, ch2) => new 
40                                     {
41                                         MatchA = (ch1 == ch2),
42                                         MatchB = (ch1 != ch2) && (value1.Contains(ch2))
43                                     }).ToArray();
44 
45             var aCount = query.Count(i => i.MatchA);
46             var bCount = query.Count(i => i.MatchB);
47 
48             return aCount * 10 + bCount;
49         }
50     }

 

posted @ 2011-10-30 21:25 天方 阅读(86) 评论(0) 编辑

当我们使用.net 4.0中的任务并行库的时候,有时候我们是需要自己控制并发粒度(调度线程数)的,这个时候往往就需要我们自己写TaskScheduler了,一个简单的实现如下:

View Code
public sealed class SimpleTaskScheduler : TaskScheduler, IDisposable
{
    BlockingCollection<Task> _tasks = new BlockingCollection<Task>();
    List<Thread> _threads = new List<Thread>();

    public SimpleTaskScheduler(int initNumberOfThreads = 3)
    {
        if (initNumberOfThreads < 1)
            throw new ArgumentOutOfRangeException();

        _threads.AddRange(Enumerable.Range(0, initNumberOfThreads).Select(_ => CreateThread()));
    }

    Thread CreateThread()
    {
        var thread = new Thread(() =>
        {
            foreach (var t in _tasks.GetConsumingEnumerable())
            {
                TryExecuteTask(t);
            }
        });

        thread.IsBackground = true;
        thread.Start();
        return thread;
    }

    protected override IEnumerable<Task> GetScheduledTasks()
    {
        //这个函数好像没有调过,返回null也不影响功能
        return _tasks.ToArray();
    }

    protected override void QueueTask(Task task)
    {
        _tasks.Add(task);
    }

    protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
    {
        return TryExecuteTask(task);
    }

    public override int MaximumConcurrencyLevel { get { return _threads.Count; } }

    #region IDisposable 成员

    public void Dispose()
    {
        if (_tasks == null)        //防止重入
            return;

        _tasks.CompleteAdding();
        _threads.ForEach(t => t.Join());

        _tasks.Dispose();
        _tasks = null;
    }

    #endregion
}

 

这个类实现并不复杂,但其实用得还是比较多的,这里记录一下,以备后续查询。

PS:当前在Parallel.ForEachParallel.For等数据并发函数中可以通过ParallelOptions.MaxDegreeOfParallelism来控制并发粒度,但无法控制调度顺序。也可以通过类似这样的TaskScheduler来改变调度顺序。

 

posted @ 2011-10-05 18:47 天方 阅读(103) 评论(0) 编辑

今天用WPF的WebBrowser控件的时候,发现其竟然没有ScriptErrorsSuppressed属性,导致其到处乱弹脚本错误的对话框,在MSDN上找到了如下解决方案

 1 static void SuppressScriptErrors(WebBrowser webBrowser, bool hide)
 2 {
 3     webBrowser.Navigating += (s, e) =>
 4         {
 5             var fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
 6             if (fiComWebBrowser == null)
 7                 return;
 8 
 9             object objComWebBrowser = fiComWebBrowser.GetValue(webBrowser);
10             if (objComWebBrowser == null)
11                 return;
12 
13             objComWebBrowser.GetType().InvokeMember("Silent", System.Reflection.BindingFlags.SetProperty, null, objComWebBrowser, new object[] { hide });
14         };
15 }

 

posted @ 2011-09-25 15:02 天方 阅读(94) 评论(0) 编辑

今天把我以前做的一个程序升级到了.NET 4.0的版本,里面有一段通过HttpWebRequest获取html的代码,第一次运行特别慢,后续运行就快了。在网上搜了一下,在http://blog.csdn.net/rrrfff/article/details/6170653中找到了原因:.NET4.0中的默认代理是开启的,使用默认代理时,只有等待超时后才会绕过代理,从而导致第一次连接特别慢。(不知道微软为什么要把这个打开)

该文章中也提到了解决方案,一般有两种:

1. 在配置文件中(.config)中添加相应配置,关闭默认代理:

 1 <?xml version="1.0"?>  
 2 <configuration>  
 3   <startup>  
 4     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>  
 5   </startup>  
 6   <system.net>  
 7     <defaultProxy  
 8         enabled="false"  
 9         useDefaultCredentials="false" >  
10       <proxy/>  
11       <bypasslist/>  
12       <module/>  
13     </defaultProxy>  
14   </system.net>  
15 </configuration>  

 

2. 通过编码的方式手动关闭Proxy。 

1     var req = WebRequest.Create("http://www.google.com") ;
2     req.Proxy = null;

 

 

posted @ 2011-09-18 22:41 天方 阅读(138) 评论(0) 编辑
摘要: Visual Studio 11 开发者预览版可以下载了,下载地址为:点击下载,提供的是旗舰版,目前支持中文和日文。在虚拟机里装上去试了一下,界面上有少许微调,.net版本是4.5,新增特性比较少,除了支持async关键字外,没有什么太大亮点,而async前在visual studio 2010中也是能支持的。至于metro界面程序,官方说是支持的,但我却没有找到相关的工程模板,不知是否得在win8里面安装才有这个功能。详细信息在在MSDN上也有专栏介绍——Visual Studio 11 Developer Preview。感兴趣的可以看一下。总之这个版本没有什么大的亮点,感觉这个不是下一代阅读全文
posted @ 2011-09-17 17:51 天方 阅读(188) 评论(0) 编辑
摘要: 在面向对象语言中,我们往往通过继承来实现代码的复用,下面代码就演示了一个简单的Log功能的例子: class Logger<T> { Subject<T> subject = new Subject<T>(); public void LogMessage(T msg) { subject.OnNext(msg); } public void Subscribe(Action<T> msgHanlder) { subject.Subscribe(msgHanlder); } } class MyClass1:Logger<string>阅读全文
posted @ 2011-09-16 20:42 天方 阅读(110) 评论(0) 编辑
摘要: shuffle算法一般也被称为洗牌算法,主要功能是将数组里的元素随机打乱,在扑克游戏及mp3播放器中比较常见。在C++的STL库中有专门的函数random_shuffle,在.net中就需要自己写了。不过这个算法并不复杂,一种常规写法如下: static Random rnd = new Random(); public static IEnumerable<T> Shuffle<T>(IEnumerable<T> source) { var elements = source.ToArray(); for (int i = elements.Length 阅读全文
posted @ 2011-09-12 18:58 天方 阅读(112) 评论(0) 编辑
摘要: 今天又见有人问所有排列方式的问题,便随手写了个: static IEnumerable<IEnumerable<int>> GetAllSequence(int n) { if (n == 1) { return Enumerable.Range(0, 1).Select(_ => new int[] { 1 }); } else { var num = Enumerable.Range(n, 1); return from seq in GetAllSequence(n - 1) from count in Enumerable.Range(0, n) sele阅读全文
posted @ 2011-09-12 16:44 天方 阅读(69) 评论(0) 编辑
摘要: 在.net中,一般是通过DateTime和TimeSpan来进行简单的时间和时间段运算,虽然对比C++中那蛋疼的时间操作来说方便了不少,但功能还是很有限的,用起来的时候往往会觉得不够用。今天在Codeproject上发现了一个非常强大的时间运算库——Time Period Library for .NET。可以通过它进行复杂的时间段的关系比较和运算。这里记录一下,以备查询。阅读全文
posted @ 2011-09-11 19:35 天方 阅读(85) 评论(0) 编辑