<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mingbo &#187; 同步</title>
	<atom:link href="http://shao.mingbo.de/tag/%e5%90%8c%e6%ad%a5/feed/" rel="self" type="application/rss+xml" />
	<link>http://shao.mingbo.de</link>
	<description>包括教育技术，编程，互联网等方面的文章及随想。</description>
	<lastBuildDate>Sun, 25 Jul 2010 05:18:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>cSharp中BackgroundWorker的用法</title>
		<link>http://shao.mingbo.de/2009/12/22/how-to-use-backgroundworker-in-csharp/</link>
		<comments>http://shao.mingbo.de/2009/12/22/how-to-use-backgroundworker-in-csharp/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 01:17:27 +0000</pubDate>
		<dc:creator>邵 明博</dc:creator>
				<category><![CDATA[csharp-note]]></category>
		<category><![CDATA[BackgroundWorker]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[myNote]]></category>
		<category><![CDATA[同步]]></category>
		<category><![CDATA[线程]]></category>

		<guid isPermaLink="false">http://shao.mingbo.de/?p=412</guid>
		<description><![CDATA[线程同步中，还有一个比较流行的类&#60;BackgroundWorker&#62;.
BackgroundWorker 类允许您在单独的专用线程上运行操作。耗时的操作（如下载和数据库事务）在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面，而且面临与这类操作相关的长时间延迟，则可以使用 BackgroundWorker 类方便地解决问题。
若要在后台执行耗时的操作，请创建一个 BackgroundWorker，侦听那些报告操作进度并在操作完成时发出信号的事件。可以通过编程方式创建BackgroundWorker，也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。如果在 Windows 窗体设计器中创建 BackgroundWorker，则它会出现在组件栏中，而且它的属性会显示在“属性”窗口中。
若要设置后台操作，请为 DoWork 事件添加一个事件处理程序。在此事件处理程序中调用耗时的操作。若要启动该操作，请调用 RunWorkerAsync。若要收到进度更新通知，请对 ProgressChanged 事件进行处理。若要在操作完成时收到通知，请对 RunWorkerCompleted 事件进行处理。
下面这个例子，主要从这几个方面来谈 cancellation support and report progress。
    public partial class Form1 : Form
    {

        public Form1()
        {
           [...]]]></description>
			<content:encoded><![CDATA[<p>线程同步中，还有一个比较流行的类&lt;<strong>BackgroundWorker</strong>&gt;.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;"><strong>BackgroundWorker</strong> 类允许您在单独的专用线程上运行操作。耗时的操作（如下载和数据库事务）在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面，而且面临与这类操作相关的长时间延迟，则可以使用 <strong>BackgroundWorker</strong> 类方便地解决问题。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;">若要在后台执行耗时的操作，请创建一个 <strong>BackgroundWorker</strong>，侦听那些报告操作进度并在操作完成时发出信号的事件。可以通过编程方式创建<strong>BackgroundWorker</strong>，也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。如果在 Windows 窗体设计器中创建 <strong>BackgroundWorker</strong>，则它会出现在组件栏中，而且它的属性会显示在“属性”窗口中。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;">若要设置后台操作，请为 DoWork 事件添加一个事件处理程序。在此事件处理程序中调用耗时的操作。若要启动该操作，请调用 RunWorkerAsync。若要收到进度更新通知，请对 ProgressChanged 事件进行处理。若要在操作完成时收到通知，请对 RunWorkerCompleted 事件进行处理。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;">下面这个例子，主要从这几个方面来谈 <strong>cancellation support</strong> and <strong>report progress</strong>。</p>
<pre name="code" class="c-sharp">    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
            this.backgroundWorker1.WorkerSupportsCancellation = true;
            this.backgroundWorker1.WorkerReportsProgress = true;

            this.backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
            this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
            this.backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);

        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (this.textBox1.Text != "" &amp;&amp; this.textBox2.Text != "")
            {
                ab a = new ab(int.Parse(this.textBox1.Text), int.Parse(this.textBox2.Text));
                this.backgroundWorker1.RunWorkerAsync(a);
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.backgroundWorker1.CancelAsync();
        }

        void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.progressBar1.Value = e.ProgressPercentage;
        }

        void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                this.textBox3.Text = "Result :Canclled!";
                this.progressBar1.Value = 100;
            }
            else if (e.Error != null)
            {
                MessageBox.Show("Error Details : " + (e.Error as Exception).ToString());
            }
            else
            {
                    this.textBox3.Text = "Result :" + e.Result;
                    this.progressBar1.Value = 100;
             }
        }

        void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            //do something here backgroundly.

                for (int i = 0; i &lt; this.progressBar1.Maximum; i++)
                {
                    Thread.Sleep(50);
                    this.backgroundWorker1.ReportProgress(i);

                    if (this.backgroundWorker1.CancellationPending)
                    {
                        e.Cancel = true;
                        return;
                    }

                }
                ab a = (ab)e.Argument;
                e.Result = a.C;

            }

    }

    class ab
    {
        private int _a;

        public int A
        {
            get { return _a; }
            set { _a = value; }
        }
        private int _b;

        public int B
        {
            get { return _b; }
            set { _b = value; }
        }
        public ab(int a,int b)
        {
            this._a = a;
            this._b = b;
        }

        public int C
        {
            get { return _b + _a; }
        }
    }</pre>
]]></content:encoded>
			<wfw:commentRss>http://shao.mingbo.de/2009/12/22/how-to-use-backgroundworker-in-csharp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cSharp中同步类的设计</title>
		<link>http://shao.mingbo.de/2009/12/21/synchronize-class-design-in-csharp/</link>
		<comments>http://shao.mingbo.de/2009/12/21/synchronize-class-design-in-csharp/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 01:42:31 +0000</pubDate>
		<dc:creator>邵 明博</dc:creator>
				<category><![CDATA[csharp-note]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[myNote]]></category>
		<category><![CDATA[同步]]></category>
		<category><![CDATA[线程]]></category>

		<guid isPermaLink="false">http://shao.mingbo.de/?p=408</guid>
		<description><![CDATA[尽量的避免问题，我们最好不要在线程之间共享数据。如果要共享数据，就必须使用同步技术：确保一次只有一个线程访问和改变共享数据。其中不可避免的要用到“锁”。使用锁是需要时间的，并且，也不是总是必须的。所以对于一个类，我们可以创建一个类的2个版本，一个同步版本，一个异步版本。下面请看这个例子：
        public class SynDemo
        {
            public virtual bool IsSynchronized
            {
          [...]]]></description>
			<content:encoded><![CDATA[<p>尽量的避免问题，我们最好不要在线程之间共享数据。如果要共享数据，就必须使用同步技术：确保一次只有一个线程访问和改变共享数据。其中不可避免的要用到“锁”。使用锁是需要时间的，并且，也不是总是必须的。所以对于一个类，我们可以创建一个类的2个版本，一个同步版本，一个异步版本。下面请看这个例子：</p>
<pre name="code" class="c-sharp">        public class SynDemo
        {
            public virtual bool IsSynchronized
            {
                get { return false; }
            }

            public virtual void doThis()
            {
                //dothis
            }

            public virtual void doThat()
            {
                //doThat
            }

            public static SynDemo SynchronizeDemo(SynDemo d)
            {
                if (!d.IsSynchronized)
                {
                    return new SynchronizedDemo(d);
                }
                return d;
            }

                    private class SynchronizedDemo : SynDemo
                    {
                        private SynDemo _demo;
                        private object _synRoot =new object();

                        public SynchronizedDemo(SynDemo d)
                        {
                            this._demo = d;
                        }

                        public override bool IsSynchronized
                        {
                            get
                            {
                                return true;
                            }
                        }

                        public override void doThat()
                        {
                            lock(_synRoot)
                            {
                                _demo.doThat();
                            }
                        }

                        public override void doThis()
                        {
                            lock(_synRoot)
                            {
                                _demo.doThis();
                            }
                        }

                    }
        }</pre>
]]></content:encoded>
			<wfw:commentRss>http://shao.mingbo.de/2009/12/21/synchronize-class-design-in-csharp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
