WPF c#-连续执行一项任务并允许执行另一项任务
我使用以下过程通过c#运行宏: 任务1: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.
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”的未处理异常。其他信息:调用目标已引发异常。