首页 > 解决方案 > 如何从 WPF 开始按钮运行任务计划程序并在 c# 中发送参数?

问题描述

我正在开发 wpf 应用程序,其中有这么多 UI 屏幕可用,并且每个 UI 都包含大量使用多线程、任务等待、调度程序和后台工作程序的处理。所以现在我有两个按钮 START 和 STOP。现在,当我单击开始按钮时,整个应用程序的进程(长时间运行的进程)需要在 while 循环中运行。这导致应用程序冻结。所以现在我想将我的进程转移到另一个普通应用程序的另一个类中。这将只包含逻辑,我只需要向该应用程序发送单个参数。

现在我想实现当我从我的 WPF 应用程序单击开始按钮时,另一个应用程序(仅包含 cs 文件,不会有任何类型的 UI)需要在 while 循环中运行。当我再次单击停止按钮时,该应用程序需要再次停止它的工作。我不知道如何实现它的逻辑,但我有一个像我描述的想法。所以请你能指导我一点,我该如何实现呢?

为此,我有一个 WPF 应用程序,第二个是控制台应用程序。现在在我的控制台应用程序代码中是这样的:

public static void Main(string[] args)
{
      startProcess("This is running");
}

public static void startProcess(string name)
{
     StreamWriter log;
     string filePath = @"D:\TimeLogFile.txt";

     for (int i = 0; i <= 10; i++)
     {
         log = File.AppendText(filePath);
         log.WriteLine(name);
         log.Close();
     }
}

现在我需要从我的 WPF 应用程序传递字符串参数,并希望从我的 WPF 应用程序运行这个控制台应用程序。那么请你指导我如何实现它?

从 WPF 应用程序中单击“开始”按钮,然后我想运行带有传递参数的控制台应用程序。我尝试了下面运行我的控制台应用程序但不知道如何传递参数并在控制台应用程序端获取它的代码。

 using(System.Diagnostics.Process process = new System.Diagnostics.Process())
{
       process.StartInfo.UseShellExecute = false;
       process.StartInfo.FileName = @"D:\StockTest.exe";
       process.StartInfo.CreateNoWindow = true;
       process.Start();
}

它正在运行控制台应用程序,但我也想在那里传递参数。那么如何将参数传递给控制台应用程序并运行控制台应用程序。

标签: c#wpfmultithreadingtaskscheduled-tasks

解决方案


您可以利用以下想法:

public class Runner
{
    private readonly MyClass _object;
    private int _flag;

    public Runner(Object param)
    {
        _object = new MyClass(param);
    }

    public void Start()
    {
        if (Interlocked.CompareExchange(ref _flag, 1, 0) == 0)
        {
            Task.Factory.StartNew(job);
        }
    }

    private void job()
    {
        while (Interlocked.CompareExchange(ref _flag, 1, 1) == 1)
        {
            // do the job on _object
        }
    }

    public void Stop()
    {
        Interlocked.Exchange(ref _flag, 0);
    }
}

然后,您在 GUI 中创建一个Runner实例,并调用Start您的 START 按钮处理程序,以及Stop- 在 STOP 处理程序中。MyClass并且param也应该进行相应的修改。

你的 while 循环在job函数内部,把你的逻辑放在那里。然后你点击 STOP,它会在下一次循环迭代时停止,所以可能需要一些时间。稍后您可能会实现一些取消逻辑以更快地做出反应。


推荐阅读