我正在尝试执行一个简单的代码。我希望结果RWL工作在消息框中显示。 当我按下按钮时,我确实等待事件发生在文本框中。当文本框事件发生时,我需要处理事件的结果。我正在尝试使用读锁定机制。但它不工作.Is机制有什么问题吗?
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)
{
}
}
}
}
答案 0 :(得分:3)
从工具箱拖动的常规计时器在UI线程中运行,因此timer1_tick将永远不会与button1_click同时运行。 system.timers.timer从另一个线程运行,如果是那种计时器,你需要锁定。
我建议使用更新的readerwriterlockslim,它更快,更少 请参阅https://issues.apache.org/jira/browse/LOG4NET-232和http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx
答案 1 :(得分:0)
添加更多细节。 System.Windows.Forms.Timer(唯一一个具有Tick事件的Timer类,您可以在WinForms中访问而不添加WPF程序集)在UI线程上运行tick事件处理程序 。扫描程序方法正在运行时,UI线程正忙,无法调用Tick事件处理程序。这意味着在您使用已详细描述的代码获取编写器锁定的同时,永远不会获得读取器锁定。
也许如果你详细说明你希望完成的事情,有人可以提供一些建议。