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

时间:2016-05-12 07:08:36

标签: c# multithreading concurrency

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

任务1:

 EXCELApplicationObj.GetType().InvokeMember("Run",
       System.Reflection.BindingFlags.Default |
       System.Reflection.BindingFlags.InvokeMethod,
       null, EXCELApplicationObj, oRunArgs);

但是当这个功能正在进行时,我想通过它的titlename检查一个窗口的出现,为此我使用了这个:

任务2:

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。

3 个答案:

答案 0 :(得分:2)

以下是运行某些代码时自动关闭窗口的示例:

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);

答案 1 :(得分:1)

您可以使用单独的线程来运行查找窗口的代码并关闭它们。您需要在对象中使用私有字段ORDER BY ROWNUM来告诉并行线程何时终止。

private bool stopClosingWindows;

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

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(); } } } } } 设置为false并启动并行线程。在您执行宏的实际代码之后,将stopClosingWindows设置为false以表示线程可以停止并终止。

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

stopClosingWindows

答案 2 :(得分:1)

我认为你希望在循环中运行“kill all untitled notepad processes”。考虑到这一点,试试这个......

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有一些时间来屏住呼吸。

嗯,我评论了第八行,因为我不确定你想用它做什么。这也是一个语法错误。

玩线程好玩!