我想知道如果程序正在运行,我可以检查特定位置的程序.例如,c:\ loc1\test.exe和c:\ loc2\test.exe中的test.exe有两个位置.我只想知道c:\ loc1\test.exe是否正在运行,而不是所有的test.exe实例.
我有一个listview,使用backgroundworker生成缩略图.当滚动列表视图时,我想暂停背景工作并获得滚动区域的当前值,当用户停止滚动列表视图时,根据滚动区域的值从项目开始恢复背景工作.
是否可以处理列表视图的滚动事件?如果有,怎么样?如果不是那么根据我上面描述的那个什么是一个好的选择?
我正在使用下面的代码释放一些正在运行的程序的内存,因为我自己的程序需要大量的内存资源才能更快地运行.
[DllImport("psapi.dll")]
public static extern bool EmptyWorkingSet(IntPtr hProcess);
public FreeMem(string programName){
EmptyWorkingSet(Process.GetCurrentProcess().Handle);
foreach(Process process in Process.GetProcesses(programName))
{
try
{
EmptyWorkingSet(process.Handle);
}
catch (Exception)
{
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
它看起来工作正常,我能够将某些程序(如资源管理器)的内存使用量从100,000 Kb降低到2,000 Kb.这很不错,但这样做有副作用吗?一些商业软件也使用它,如Yamicsoft Vista/Xp管理器和Firefox优化器,仅举几例,所以我在想,如果这没有不良副作用或存在?
我想让列表视图仅在项目在屏幕上可见时才显示缩略图。有没有办法做到这一点?
这是场景,我打开我的应用程序然后托盘图标显示,如果我双击托盘图标,将显示主界面.如果我再次打开我的应用程序,主界面应该被给予焦点或如果它还没有显示那么它应该显示而不是打开我的应用程序的另一个实例.
这是我的代码的样子:
//Program.cs
.....
if(myAppIsNotRunningYet) //the program has not been open yet
{
MyTray = new MyTray();
Application.Run();
}
else //the program is already on the tray
{
//the code to give focus to the mainForm or open it up if not yet open
}
//MyTray.cs
.....
public MyTray()
{
notifyIcon = new NotifyIcon();
....
notifyIcon.Visible = true;
}
private void notifyIcon_DoubleClick(object sender, EventArgs e)
{
MainForm mainForm = new MainForm();
mainForm.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud) 我正在创建一个BackgroundWorker数组,它共享一个这样的事件处理程序:
BackgroundWorker[] workers = new BackgroundWorker[files.length];
for(int i = o; i<files.length; i++)
{
workers[i] = new BackgroundWorker();
workers[i].DoWork += new DoWorkEventHandler(worker_DoWork);
workers[i].RunWorkerCompleted += newRunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
workers[i].RunWorkerAsync(files[i]);
}
Run Code Online (Sandbox Code Playgroud)
所有工作者都共享相同的事件处理程序,它只使用不同的参数和结果执行相同的操作,如下所示
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
e.Result = ComputeSomething(e.Argument.ToString());
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
resultArray.Add(e.Result);
}
private int ComputeSomething(string file)
{
...
return number;
}
Run Code Online (Sandbox Code Playgroud)
显然在代码中,我正在尝试创建一个异步运行的BackgroundWorker列表,但是当我检查结果时,其中一些是不正确的.我猜测"e.result"的值被其他工作者替换,因为如果是这样的话我们共享相同的事件处理程序然后我想为每个BackgroundWorker创建单独的事件处理程序,以便e.result的值不会被取代.我该怎么做?