gpt4 book ai didi

c# - 在 WPF .NET Framework 中使用自定义任务管理器时,如何防止进程重复?

转载 作者:可可西里 更新时间:2023-11-01 09:32:53 24 4
gpt4 key购买 nike

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Diagnostics;
using System.IO;

namespace CustomizedWPFTaskManager
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

//Load Function
OnLoad();
}

private void OnLoad()
{
System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0, 0, 2);
dispatcherTimer.Start();
}

private void dispatcherTimer_Tick(object sender, EventArgs e)
{
//- Refresh process list
Process pList = new Process();
List<String> procList = new List<string>(new string[] { "" });


foreach (Process p in Process.GetProcesses())
{
try
{
FileInfo fi = new FileInfo(p.MainModule.FileName);

procList.Add(fi.Name);
TaskViewBox1.Items.Add(fi.Name);
}
catch { }
}

countLabel.Content = TaskViewBox1.Items.Count + " PROCESSES RUNNING";
}
}
}

这是我目前所拥有的,但我的问题是进程将继续添加,即使它们已经是它们的(重复项)。我也是新手,我的老板一直在教我在店里帮忙。他也希望我学习 WPF。这是我认为不错的第一个项目,对如何删除重复项有帮助吗?另外,如果它不是太多,你能解释一下你做了什么吗,但我不仅仅是复制代码,而是为了下次实际学习它。

最佳答案

让我们来看一个使用 MVVM 架构模式的非常基本的示例。

首先是 View 模型。它有一个 Processes属性,这是一个 ObservableCollection<Process>和一个 Tick DispatcherTimer 的事件处理程序,更新集合。

public class ViewModel
{
public ObservableCollection<Process> Processes { get; }
= new ObservableCollection<Process>();

public ViewModel()
{
var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(2) };
timer.Tick += UpdateProcesses;
timer.Start();
}

private void UpdateProcesses(object sender, EventArgs e)
{
var currentIds = Processes.Select(p => p.Id).ToList();

foreach (var p in Process.GetProcesses())
{
if (!currentIds.Remove(p.Id)) // it's a new process id
{
Processes.Add(p);
}
}

foreach (var id in currentIds) // these do not exist any more
{
Processes.Remove(Processes.First(p => p.Id == id));
}
}
}

现在是 View 。这是一个简单的列表框,显示 IdProcessName进程的集合。它的ItemsSource绑定(bind)到 Processes View 模型的属性。

<ListBox ItemsSource="{Binding Processes}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Id}" Width="50"/>
<TextBlock Text="{Binding ProcessName}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

最后,必须将 View 模型的一个实例分配给 MainWindow 的 DataContext。这可以在 XAML 中完成

<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>

或在代码后面

public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}

关于c# - 在 WPF .NET Framework 中使用自定义任务管理器时,如何防止进程重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41514106/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com