WPF c#-连续执行一项任务并允许执行另一项任务

WPF c#-连续执行一项任务并允许执行另一项任务,c#,multithreading,concurrency,C#,Multithreading,Concurrency,我使用以下过程通过c#运行宏: 任务1: EXCELApplicationObj.GetType().InvokeMember("Run", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, EXCELApplicationObj, oRunArgs); Process[] processlist = Process.

我使用以下过程通过c#运行宏:

任务1:

 EXCELApplicationObj.GetType().InvokeMember("Run",
       System.Reflection.BindingFlags.Default |
       System.Reflection.BindingFlags.InvokeMethod,
       null, EXCELApplicationObj, oRunArgs);
Process[] processlist = Process.GetProcesses();
foreach (Process process in processlist)
{
    if (!String.IsNullOrEmpty(process.MainWindowTitle))
    {
        process.ProcessName, process.Id, process.MainWindowTitle);
        if (process.MainWindowTitle == "Untitled - Notepad") {
            process.Kill();
        }
    }
}
但是,在执行此函数时,我想通过标题名检查窗口的出现情况,为此,我使用了以下方法:

任务2:

 EXCELApplicationObj.GetType().InvokeMember("Run",
       System.Reflection.BindingFlags.Default |
       System.Reflection.BindingFlags.InvokeMethod,
       null, EXCELApplicationObj, oRunArgs);
Process[] processlist = Process.GetProcesses();
foreach (Process process in processlist)
{
    if (!String.IsNullOrEmpty(process.MainWindowTitle))
    {
        process.ProcessName, process.Id, process.MainWindowTitle);
        if (process.MainWindowTitle == "Untitled - Notepad") {
            process.Kill();
        }
    }
}
但问题是,我想在这个过程中运行这个并行程序,以便执行宏,当新窗口显示为“Untitled-Notepad”时,我想关闭它。 任何stackoverflowers都可以给我一些指导。 听说过穿线,但我对穿线知之甚少

更新: 我在寻找什么:


连续执行Task2并允许执行Task1。

您可以使用单独的线程来运行查找并关闭窗口的代码。在对象中需要一个私有字段
stopClosingWindows
,以告知并行线程何时终止

私人停车场关闭窗户

您需要一个单独的方法来执行查找窗口并在循环中关闭窗口的操作:

private void ParallelCloseWindows()
{
    while (!stopClosingWindows)
    {
        // Only look every 200ms so we don't waste processor ressources
        Thread.Sleep(200);

        // perform the task
        Process[] processlist = Process.GetProcesses();
        foreach (Process process in processlist)
        {
            if (!String.IsNullOrEmpty(process.MainWindowTitle))
            {
                if (process.MainWindowTitle == "Untitled - Notepad")
                {
                    process.Kill();
                }
            }
        }
    }
}
现在,在开始实际代码执行宏之前,请将
stopClosingWindows
设置为false并启动并行线程。在实际代码执行宏后,将
stopClosingWindows
设置为false,以指示线程可以停止并终止

使用try/finally,这样即使在执行宏时出现异常,并行线程也会停止

stopClosingWindows = false;
try
{
    // Create a new thread that should execute the method ParallelCloseWindows in parallel
    var thread = new Thread(ParallelCloseWindows);

    // set isBackground to true so that this thread would not prevent your application from closing when 
    // we forget to terminate it
    thread.IsBackground = true;

    // and start the new thread
    thread.Start();

    EXCELApplicationObj.GetType().InvokeMember("Run", 
            System.Reflection.BindingFlags.Default 
            | System.Reflection.BindingFlags.InvokeMethod,
            null, EXCELApplicationObj, oRunArgs);
}
finally
{
    stopClosingWindows = true;
}

我认为您希望在循环中运行“杀死所有无标题记事本进程”。记住这一点,试试这个

public void killNotepad()
    {
        Process[] processlist = Process.GetProcesses();
        foreach (Process process in processlist)
        {
            if (!String.IsNullOrEmpty(process.MainWindowTitle))
            {
                //process.ProcessName, process.Id, process.MainWindowTitle);
                if (process.MainWindowTitle == "Untitled - Notepad")
                {
                    process.Kill();
                }
            }
        }
    }

    public void killNotepadRunAsync()
    {
        System.Threading.Thread th = new System.Threading.Thread(() =>
        {
            while (true)
            {
                killNotepad();
                System.Threading.Thread.Sleep(300);
            }
        });
        th.SetApartmentState(System.Threading.ApartmentState.STA);
        th.Start();
    }
“killNotepad()”方法在由“killNotepadRunAsync()”方法执行的线程中运行多次,因此在需要时调用killNotepadRunAsync()方法

System.Threading.Thread.Sleep(300)使线程在进行下一个Process.getProcesses()调用之前休眠300毫秒,这会给cpu一些喘息的时间

嗯,我把第八行注释掉了,因为我不知道你想用它做什么。这也是一个语法错误


享受线程的乐趣

下面是一个在运行某些代码时自动并行关闭窗口的示例:

static void Main() {

    // execute AsyncCloseTopWindow in parallel to close a window named "Untitled - Notepad"
    var thread = new Thread(AsyncCloseTopWindow);
    thread.IsBackground = true;          
    thread.Start("Untitled - Notepad");

    // execute the macro while AsyncCloseTopWindow is running 
    //...

    // exit AsyncCloseTopWindow
    thread.Interrupt();
}

private static void AsyncCloseTopWindow(object windowTitle) {
    try {
        while (true) {

            // close any window matching the title
            IntPtr hwnd = FindWindow(IntPtr.Zero, (string)windowTitle);
            if (!hwnd.Equals(IntPtr.Zero)) {
                SendMessage(hwnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
            }

            // wait 30ms
            Thread.Sleep(30);
        }
    } catch (ThreadInterruptedException) { }
}

private const UInt32 WM_CLOSE = 0x0010;

[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern IntPtr FindWindow(IntPtr lpClassName, string lpWindowName);

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

谢谢你@NineBerry。。。但当我尝试时,我在宏操作行遇到异常。。。任何想法<代码>在mscorlib.dll中发生“System.Reflection.TargetInvocationException”类型的未处理异常附加信息:调用的目标已引发异常。我想说,当宏试图对其创建的记事本窗口执行某些操作时,宏中会发生错误。似乎无法简单地关闭记事本实例。也许在宏完成执行后将它们全部关闭?谢谢NineBerry,但只有在关闭记事本时宏才会退出。。。否则我必须手动关闭它。您好@Florent B.,知道如何在wpf中使用DllImport吗,它显示错误。错误4找不到类型或命名空间名称“DllImport”(您是否缺少using指令或程序集引用?我想它将在c#winfroms中使用,但不会在wpfI中使用。我刚刚测试了一个新的WPF应用程序。它按预期工作。完整签名是
System.Runtime.InteropServices.DllImport
。请注意,
DllImport
它需要放在一个类中。非常感谢您……我已经收到了。)有一段时间一直在讨论这个问题…非常感谢…我的宏调用出现了一个异常,它说:
在mscorlib.dll中发生了类型为“System.Reflection.TargetInvocationException”的未处理异常。其他信息:调用目标已引发异常。