0

簡単なコードを実行しようとしています。結果のRWLが機能することをメッセージボックスに表示することを期待しています。ボタンを押すと、テキストボックスでイベントが発生するのを待ちます。テキストボックスイベントが発生すると、イベントの結果を処理する必要があります。読み取りロックメカニズムを使用しようとしていますが、機能していません。メカニズムに何か問題がありますか?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace ReadWriteLockTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        static ReaderWriterLock rwl = new ReaderWriterLock();
        static int resource = 0;

        private void button1_Click(object sender, EventArgs e)
        {
            scanner();
        }

        private void scanner()
        {
            int falg = 0;
            int i = 0;

            while (true)
            {
                Thread.Sleep(5000);
                try
                {
                    rwl.AcquireReaderLock(100);
                    try
                    {
                        Console.WriteLine(i);
                         i++;

                        if (resource == 1)
                            falg = 1;
                    }
                    finally
                    {
                        rwl.ReleaseReaderLock();
                    }
                }
                catch (ApplicationException)
                {

                }
                if (falg == 1)
                    break;
            }

            MessageBox.Show("RWL WORKS");

        }

        private DateTime CharReadTime;
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
           CharReadTime = DateTime.Now;
            if (!timer1.Enabled)
                timer1.Start();
        }

        int j = 0;
        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Enabled = true;
            timer1.Interval = 1000;
        }

        private void timer1_Tick_1(object sender, EventArgs e)
        {
            const int timeout = 3;

            Console.WriteLine("j =" + j);
            j++;
            if ((DateTime.Now - CharReadTime).Seconds < timeout)
                return;

            if (String.Compare(textBox1.Text, "") == 0)
                return;

            try
            {
                rwl.AcquireWriterLock(100);
                try
                {
                    resource = 1;
                }
                finally
                {
                    rwl.ReleaseWriterLock();
                }
            }
            catch (ApplicationException)
            {
            }

        }


    }
}
4

2 に答える 2

3

ツールボックスからドラッグした通常のタイマーは UI スレッドで実行されるため、timer1_tick が button1_click と同時に実行されることはありません。system.timers.timer は別のスレッドから実行され、その種類のタイマーの場合はロックが必要になります。

https://issues.apache.org/jira/browse/LOG4NET-232およびhttp://msdn.microsoft.com/en-us/library/を参照してください。 system.threading.readerwriterlockslim.aspx

于 2012-07-21T21:20:38.100 に答える
0

もう少し詳細を追加します。System.Windows.Forms.Timer (WPF アセンブリを追加せずに WinForms でアクセスできる Tick イベントを持つ唯一の Timer クラス) は、UI スレッドで tick イベント ハンドラーを実行します。スキャナー メソッドの実行中は、UI スレッドがビジーで、Tick イベント ハンドラーを呼び出すことができません。これは、詳細を説明したコードでライター ロックを取得すると同時に、リーダー ロックを取得することは決してできないことを意味します。

達成したいことを詳しく説明すれば、誰かがアドバイスをくれるかもしれません。

于 2012-07-21T22:14:54.517 に答える