C# 如何在保持程序轻量级的同时模拟键盘并同时运行多个命令?

C# 如何在保持程序轻量级的同时模拟键盘并同时运行多个命令?,c#,midi,piano,C#,Midi,Piano,作为一种爱好,最近我一直在做一个钢琴(Midi)到键盘的软件,但我遇到了一个问题,能够同时听和执行几个键,我决定使用if和else if,但我知道该程序正在使用cpu的足够资源,并且当if被激活时 注释中的示例1: if (RawNotes.Contains ("Len: 0") == true && RawNotes.Contains ("0 NoteOn Ch: 1 C") == true && RawNotes.Contains ("#") == false

作为一种爱好,最近我一直在做一个钢琴(Midi)到键盘的软件,但我遇到了一个问题,能够同时听和执行几个键,我决定使用if和else if,但我知道该程序正在使用cpu的足够资源,并且当if被激活时

注释中的示例1:

if (RawNotes.Contains ("Len: 0") == true && RawNotes.Contains ("0 NoteOn Ch: 1 C") == true && RawNotes.Contains ("#") == false)
例2:关于Off Note:

else if (RawNotes.Contains("Vel") == true && RawNotes.Contains("0 NoteOn Ch: 1 C") == true && RawNotes.Contains("#") == false)
检查原始注释字符串

示例RawNotes字符串输出

这个字符串是不断变化的,这是字符串使用Console.WriteLine(RawNotes)给我的输出


0注释关于Ch:1 C3 Vel:41 Len:0//你能给出一个rawnotes字符串的示例吗?好的,我在问题中添加了该字符串。只有当它得到一个新值时,你才应该解析
rawnotes
。在线程之间通信时,不应使用普通变量,而应使用某种消息。什么是“sim”变量?它是Michael Noonan的Windows输入模拟器的一个实例还是其他分支之一?如果是这样的话,您需要了解如何。依靠一些应该被解析的字符串来发送MIDI事件看起来很奇怪。您是否至少可以订阅
RawNotes
changing并摆脱
while
loop(这就是您看到高CPU使用率的原因)?另外,我认为您需要在
lock
部分中执行解析。
0 NoteOn Ch: 1 C3 Vel: 41 Len: 0 //<-- NoteOn
0 TimingClock
0 TimingClock
0 TimingClock
0 TimingClock
0 NoteOn Ch: 1 C3 Vel: 0 //  <-- NoteOff
0 AutoSensing
0 TimingClock
 Thread One = new Thread(() =>
{
     while (true)
                    {
                        if (RawNotes.Contains ("Len: 0") == true && RawNotes.Contains ("0 NoteOn Ch: 1 C") == true && RawNotes.Contains ("#") == false)

                        {
                            sim.Keyboard.KeyDown((VirtualKeyCode)Enum.Parse(typeof(VirtualKeyCode), Key1)); // <-- The problem
                        }

 else if (RawNotes.Contains("Vel") == true && RawNotes.Contains(MultiHelp + "C") == true && RawNotes.Contains("#") == false)
                        {
                            sim.Keyboard.KeyUp((VirtualKeyCode)Enum.Parse(typeof(VirtualKeyCode), Key1));

//And so on...