我正在使用用 C# 为 Windows 8 编写的桌面应用程序来提供剪贴板上不同设备传感器的读数。现在,有一个外部应用程序(我对其结构没有任何控制权),我的应用程序将与之交互。这两个应用程序都使用相互文本文件作为开关。当外部应用程序需要我的读数时,它会将文本文件重命名为“SensorsTurn.txt”并在剪贴板上放置一个触发词,例如(“sensors”)当我的应用程序看到文件已被这样命名时,它会读取触发器的剪贴板,相应地收集数据,将其放在剪贴板上并将文本文件重命名为“RBsTurn.txt”。问题是,我需要我的程序在运行时不断检查该文件的名称。我想到的一种非常基本的方法是将程序放入无限的while循环中。但这显然是一个非常糟糕的方法。当我在任务管理器中看到我的应用程序时,它占用了大量不应该的 CPU 处理。我发现的另一个建议是让我的循环成为后台线程,这样效率更高一些。但是两次连续读数之间的时间变慢了。我为之工作的人报告说:“我第一次尝试写入剪贴板时,它写入速度非常快,但在随后的写入中大约需要 3 秒(我经常有两个程序与剪贴板通信)。我怀疑你的程序没有以某种方式释放剪贴板。一旦我能够写入剪贴板,我就会更改文件名并立即取回你的数据。
namespace sampleApplication
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//Initialize sensor variables
LightSensorReading _newLightSensorReading;
LightSensor _LightSensor = LightSensor.GetDefault();
string _pathString = System.IO.Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "dummy");
private void Form1_Load(object sender, EventArgs e)
{
//InitializeDevices();
System.IO.Directory.CreateDirectory(_pathString);
string _filePathSensors = System.IO.Path.Combine(_pathString, "SensorsTurn.txt");
string _filePathRBsTurn = System.IO.Path.Combine(_pathString, "RBsTurn.txt");
string _triggerString = "";
int x = 1;
Thread th = new Thread(() =>
{
while (x == 1)
{
if (System.IO.File.Exists(_filePathSensors))
{
_triggerString = Clipboard.GetText();
switch (_triggerString)
{
case "sensors":
if (_LightSensor != null)
{
_newLightSensorReading = _LightSensor.GetCurrentReading();
string _deviceReading = "LightSensor" + "," + _newLightSensorReading.IlluminanceInLux.ToString();
Clipboard.SetText(_deviceReading);
System.IO.File.Move(_filePathSensors, _filePathRBsTurn);
}
break;
case "stop":
Clipboard.Clear();
System.IO.File.Move(_filePathSensors, _filePathRBsTurn);
Application.Exit();
break;
}
}
}
});
th.IsBackground = true;
th.SetApartmentState(ApartmentState.STA);
th.Start();
}
}
}
长话短说,有两个问题:1)如何在不使用低效无限循环的情况下连续检查文件名?我可以以某种方式定义一个事件吗?2)我的程序在使用后没有足够快地释放剪贴板。可能是什么原因?