我在尝试打开互斥锁时遇到此异常(有时只会发生;大多数调用都成功):
System.UnauthorizedAccessException: Access to the path 'Global\4c7cddf7-e729-43b6-a75c-43f54a0ac6ac' is denied.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.Threading.Mutex.OpenExisting(String name, MutexRights rights)
Run Code Online (Sandbox Code Playgroud)
我用来处理互斥锁的代码:
public class MutexLocker : IDisposable
{
public MutexLocker(string id)
{
var doesNotExist = false;
var unauthorized = false;
try
{
_mutex = Mutex.OpenExisting(id, MutexRights.Synchronize | MutexRights.Modify);
}
catch (WaitHandleCannotBeOpenedException)
{
doesNotExist = true;
}
catch (UnauthorizedAccessException ex)
{
unauthorized = true;
}
if (doesNotExist)
{
_mutex = new Mutex(false, id);
var allowEveryoneRule = new MutexAccessRule(
new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.FullControl, AccessControlType.Allow); …Run Code Online (Sandbox Code Playgroud) 我有一个.NET应用程序,我只允许在一个时间运行一个进程,但该应用程序不时在Citrix盒子上使用,因此,可以由同一台机器上的多个用户运行.
我想检查并确保应用程序仅在每个用户会话中运行一次,因为如果用户A正在运行应用程序,那么用户B将获得"已在使用的应用程序"消息,而不应该.
这就是我现在检查正在运行的进程:
Process[] p = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName);
if (p.Length > 1)
{
#if !DEBUG
allowedToOpen &= false;
errorMessage +=
string.Format("{0} is already running.{1}", Constants.AssemblyTitle, Environment.NewLine);
#endif
}
Run Code Online (Sandbox Code Playgroud) 我有一个运行另一个的程序(让我们调用第一个应用程序Stater和第二个应用程序 - 工作者).
我用
process.start();
process.waiForExit();
process.Close();
Run Code Online (Sandbox Code Playgroud)
在初学者.
但是如果Starter在等待Worker时被迫关闭(出于某些外部原因),Worker仍将处理进程,阻塞文件,吃内存等.
所以,我想在我尝试启动之前检查Worker是否已经运行.我已经尝试过Process.GetProcessesByName("worker.exe")但没有运气(即使我可以在任务管理器中看到Worker).
我在这里看到了一些关于检查内存中每个进程的模块的主题,但我仍然知道正在运行的文件,我希望避免这样的解决方案.
有什么建议吗?
为什么以下结构会导致AbandonedMutexException.即使有错误或方法返回.互斥体正在被释放.
static Mutex WriteMutex = new Mutex(false, @"Global\mutex2203");
public static void Demo()
{
try
{
WriteMutex.WaitOne();
//rest of coding stuff here
}
finally
{
WriteMutex.ReleaseMutex();
}
}
Run Code Online (Sandbox Code Playgroud)
接收报告无法重新生成错误.
编辑:WriteMutex.WaitOne();没有其他代码发生异常.只有这种方法才能触及互斥锁.
我使用Applicationdomain动态加载一个DLL,以便在nessesary时卸载.如果加载的dll中的任务终止,那么我无法工作的是来自创建的Appdomain的回调方法.
到目前为止我有什么
public interface IBootStrapper
{
void AsyncStart();
void StopAndWaitForCompletion();
event EventHandler TerminatedItself;
}
Run Code Online (Sandbox Code Playgroud)
和"初学者"方面
private static Procedure CreateDomainAndStartExecuting()
{
AppDomain domain = AppDomain.CreateDomain("foo", null, CODEPATH, string.Empty, true);
IBootStrapper strapper = (IBootStrapper)domain.CreateInstanceAndUnwrap(DYNAMIC_ASSEMBLY_NAME, CLASSNAME);
strapper.ClosedItself += OnClosedItself;
strapper.AsyncStart();
return delegate
{
strapper.StopAndWaitForCompletion();
AppDomain.Unload(domain);
};
}
Run Code Online (Sandbox Code Playgroud)
这导致程序集未找到异常,因为OnClosedItself()是一个只有Starter知道的类型的方法,它在appdomain中不存在.
如果我将OnClosedItself作为委托包装在一个可序列化的类中,它就是一样的.
有什么建议?
编辑:我正在尝试做的是建立一个自我更新的任务.因此我创建了一个启动器,如果有新版本可以停止并重新创建任务.但是如果任务从其他地方停止,它也应该通知启动器终止.
//从问题中删除了大量临时代码
编辑2:哈普洛指出我正确的方向.我能够用信号量实现回调.
我正在寻找在单独的类库项目中定义的窗口(WPF)作为新的单独进程.有没有办法做到这一点?
我需要在新进程中启动第二个项目实例,因为当我以这种方式启动它时会占用内存:
secondProject.WPFWindow win = new secondProject.WPFWindow();
win.Show();
Run Code Online (Sandbox Code Playgroud)
我有一个包含多个项目的解决方案.
现在我通过以下代码运行"应用程序"(此解决方案中构建为dll的其他项目):
secondProject.WPFWindow win = new secondProject.WPFWindow();
win.Show();
Run Code Online (Sandbox Code Playgroud)
我想要在新进程中运行应用程序...通常我会使用Process.Start(),但我不能这样,因为它需要exe文件作为agrument我有(并且想要)DLL.
我已经看到了有关使用 WPF 创建单实例应用程序的所有其他问题,并且我选择使用此处描述的 Microsoft 方法: https: //codereview.stackexchange.com/a/25667
这工作正常,但现在我想在这个应用程序上使用 Caliburn.Micro,而这段代码不能很好地与 caliburn 配合使用。
如何使用 caliburn micro 拥有单实例 wpf 应用程序?
要求非常简单:.net 4.5 并且每个用户会话只有一个应用程序实例
谢谢
我试着这样做:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Diagnostics;
using DannyGeneral;
namespace mws
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
try
{
if (IsApplicationAlreadyRunning() == true)
{
MessageBox.Show("The application is already running");
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
catch (Exception err)
{
Logger.Write("error " + err.ToString());
}
}
static bool IsApplicationAlreadyRunning()
{
string proc = Process.GetCurrentProcess().ProcessName;
Process[] processes = Process.GetProcessesByName(proc); …Run Code Online (Sandbox Code Playgroud) 我有一个Windows应用程序(C#),我需要将其配置为当时从应用程序运行一个实例,这意味着一个用户单击.exe文件并运行应用程序并且用户没有关闭第一个实例正在运行的应用程序,需要运行下一个实例,因此它应该出现在第一个实例而不是打开新实例.
任何人都可以帮我怎么做?
提前致谢
为了防止用户运行我的应用程序的多个实例,我使用此代码: -
Process[] pArry = Process.GetProcesses();
int nCount = 0;
foreach (Process p in pArry)
{
string ProcessName = p.ProcessName;
ProcessName = ProcessName.ToLower();
if (ProcessName.CompareTo("myApp") == 0)
{
nCount++;
}
}
if (nCount > 1)
{
MessageBox.Show(AppAlreadyRunning,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
Process.GetCurrentProcess().Kill();
}
Run Code Online (Sandbox Code Playgroud)
但正如我们所知,如果更改exe名称,进程名称会更改.因此,如果用户将"myApp.exe"更改为"UserApp.exe",则此修补程序将无效!有什么出路吗?
我在VS2010中使用C#.谢谢!