关于同步交谈,一天,我发表这篇文章的CCR和DSS成为一个可下载的产品。你可以找到新的产品{A}。我建议你看这个产品,我怀疑这是在同时进行。NET软件开发的基石。简介
我经常重温我写的思想和经验教训的代码,我去接随着时间的推移,改善地区的应用。似乎永远是一个主要目标,这是为了提高性能。当谈到提高性能有很多事情可以做,但最终,你永远看多线程。这是理论上最简单的建议的概念,但并不总是最容易实现的。如果你曾经运行到资源共享的问题,你会明白我的意思,虽然有很多文章就如何做到这一点,它并不总是网状每一个解决方案。
早前我碰到一些所谓的CCR来到,它是像神奇的代码由两个向导,杰夫里氏和乔治Chrysanthakopoulos创建。部分神奇的是正确地滚下你的舌头Chrysanthakopoulos音节整齐一口气,当你过去,你会看到在多线程的恐怖走廊结束。这种托管的DLL是挤满了苦苦的多线程的乐趣和普通线程的复杂性提供了多层次的简单。换句话说,如果你想实现一个多线程层,以改善应用程序的性能,那么你需要生活和呼吸的CCR。对于一些大背景和乐趣,抓住一些爆米花和访问{A2}杰夫和乔治背景
观看视频转换后,你应该来,随着一些勇气开始使用CCR的一些信心和启示。所以你打开你的最新项目,并...从哪里开始呢?那么你就可以开始的地方之一是通过创建一个简单的asynchronousnbsp;记录。大多数应用程序,我的设计有不同的生产诊断记录的水平,但如果你不使用线程模型利用Logger类时,那么你已经创建了阻塞的代码和明显改进的空间。因此,让你开始,我会告诉你如何实现CCR'd Logger类写入到本地文件。有许多方法来记录数据,但对于这个演示中,我用简单的本地记录。您将最有可能在此{A3}感兴趣,它会解释的CCR中的多面性。使用代码
下面的代码可以放到您的应用程序和使用权,虽然基本,它可以作为替代任何记录您目前实施的方法。
我们需要做的第一件事是到新的一些东西称为一个Dispatcher,认为这个线程quot; poolquot;注意quot; 1quot;,这意味着我们只需要一个线程的处理,因此,这些呼吁所有quot; postsquot;类将执行异步但连续。如果你正在编写一个SQL数据库,您可以尝试增加这个数字,但知道数据可能不按顺序到达!当利用其他非顺序任务的调度,尽量增加这个数字。//Create Dispatcher
private static readonly Dispatcher _logDispatcher = new Dispatcher(1, "LogPool");
其次,你会想要一个DispatcherQueue。的DQ方法管理您的与会代表名单,你需要在需要时执行的方法。{C}
接下来,您需要一个端口,端口,如输入队列。你quot; postquot;端口调用您的注册方法。//Message Port
private static readonly Port<string> _logPort = new Port<string>();
现在的类,不要忘记包括在指令CCR的!
兴趣点using System;
using System.IO;
using System.Threading;
using Microsoft.Ccr.Core;
namespace CCRing_Demo
{
public static class DataLogger
{
//Create Dispatcher
private static readonly Dispatcher _logDispatcher = new Dispatcher(1,
ThreadPriority.Normal, false, "LogPool");
//Create Dispatch Queue
private static DispatcherQueue _logDispatcherQueue;
//Message Port
private static readonly Port<string> _logPort = new Port<string>();
//Fields
private static string _logFileName;
private static void Init()
{
_logDispatcherQueue = new DispatcherQueue("LogDispatcherQueue",
_logDispatcher);
Arbiter.Activate(_logDispatcherQueue, Arbiter.Receive(true, _logPort,
WriteMessage));
_logFileName = "DMT_Message_Log_" + String.Format("{0:yyMMddHHmmss}",
DateTime.Now) + ".log";
}
private static void WriteMessage(string messageString)
{
using (var sw = File.AppendText(_logFileName))
sw.WriteLine("[{0:HH:mm:ss tt}] {1}", DateTime.Now, messageString);
}
public static void Log(string messageString)
{
if (String.IsNullOrEmpty(_logFileName))
Init();
_logPort.Post(messageString);
}
//Any thread tasks still running?
private static bool PendingJobs
{
get
{
return (_logDispatcher.PendingTaskCount > 0 ||
_logPort.ItemCount > 0) ? true : false;
}
}
//Since we are not using background threading we need to add this method to
//dispose the DQ for application end
public static void StopLogger()
{
while (PendingJobs){Thread.Sleep(100);}
_logFileName = null;
_logDispatcherQueue.Dispose();
}
}
}
CCR不来与Visual Studio的最新版本。这是微软的Robotics Studio的一部分,但不是下载整个工作室,我已经包含了DLL以上,使您可以添加到您的项目的参考。
有一件事你应该注意从上面的代码是缺乏回调嵌套,这里涉及的,确实是一个很好的模式。
另外,如果你使用后台线程您的主/初始线程将等待的Dispatcher,即使完成所有排队的职位。您可以处理的方式,如newing没有后台线程Distpatcher但在这种情况下,你要检查,以确保所有的工作都与PendingJobs完成。
尽管这个类在它的设计和目的是相当简单的,你至少应该看到电源的CCR只需几行代码,持有出来。单步执行代码,并添加一些额外的乐趣端口。你越了解CCR的越多,你会看到如何可以改善,只是你从这里进编写的任何应用程序。
的快乐CCRing!历史2008年10月,29日:战后初期