c# - 如何在 c# 程序中连续运行函数

标签 c# .net windows-8 desktop-application clipboard

我正在使用用 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)我的程序在使用后没有足够快地释放剪贴板。可能是什么原因?

最佳答案

您可以使用 File System Watcher,而不是不断寻找更改的名称。对象回应Renamed事件。这可能会完全避免这个问题。

更新:

这是 blog post (之前在评论中提到)关于这个主题

关于c# - 如何在 c# 程序中连续运行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16401018/

相关文章:

c# - 读取Excel互操作单元格: Cannot convert mthod group 'ToString' to non-delegated type 'String' [closed]时出错

.net - Tiff 注释

c# - PL/SQL 是否具有 C# 中数组参数的等价物?

c# - 如何在 Windows 窗体应用程序中迭代控件?

.net - 为什么 .NET winform 在大 DPI 设置下无法正确缩放?

.net - Windows 应用程序的品牌版本

c# - Windows RT 中的自定义触摸键盘

c# - 如何在 Windows 8 Metro 应用程序中有用户提示对话框?

opencv - windows 8和windows phone 8的opencv图像编辑库

c# - 从另一个 int[] 中的值构建 int[]