我有一个Web应用程序,可以控制哪些Web应用程序从我们的负载均衡器获得流量.Web应用程序在每个服务器上运行.
它跟踪ASP.NET应用程序状态中对象中每个应用程序的"进入或退出"状态,并且只要状态发生更改,就将对象序列化为磁盘上的文件.Web应用程序启动时,将从文件反序列化状态.
虽然网站本身只获得了几个请求,并且它很少访问该文件,但我发现由于某种原因,在尝试读取或写入文件时发生冲突非常容易.这种机制需要非常可靠,因为我们有一个自动化系统,可以定期对服务器进行滚动部署.
在任何人发表任何有关上述任何一个问题的评论之前,请允许我简单地说,解释它背后的推理会使这个帖子比现在更长,所以我想避免移山.
也就是说,我用来控制文件访问的代码如下所示:
internal static Mutex _lock = null;
/// <summary>Executes the specified <see cref="Func{FileStream, Object}" /> delegate on
/// the filesystem copy of the <see cref="ServerState" />.
/// The work done on the file is wrapped in a lock statement to ensure there are no
/// locking collisions caused by attempting to save and load the file simultaneously
/// from separate requests.
/// </summary>
/// <param name="action">The logic to be executed on the
/// <see cref="ServerState" /> …Run Code Online (Sandbox Code Playgroud) 我正在Windows服务中创建一个名为mutex,需要可以从常规应用程序访问.到目前为止,我创建了一个名称类似于Global\<GUID>的互斥锁.
现在,当我尝试从应用程序打开互斥锁时,我收到了未经授权的访问冲突.如何在创建时配置互斥锁以允许访问系统中的任何进程?
我的程序作为服务或控制台运行.我创建了一个System.Threading.Mutex,只启动两种模式中的一种.在这里我的代码
public class MyServer
{
// Private variable
System.Threading.Mutex serverMutex;
public MyServer ()
{
bool createdNew;
ServerMutex = new System.Threading.Mutex(true, "MyServerMutex", out createdNew);
if (!createdNew)
{
throw new Exception("Another server instance is running");
}
}
}
Run Code Online (Sandbox Code Playgroud)
首先启动控制台,然后启动另一个控制台,抛出异常.首先启动服务,控制台不会抛出异常.首先启动控制台,然后服务是相同的.
有任何想法吗?我想知道,因为我认为,几个月前,当我实现该功能时,它已经全部工作了.
我正在使用.NET 4.0.
谢谢,弗雷迪
我有一个带有 C# 代码的 Windows 窗体应用程序,如下所示(针对 .NET Framework 4)。
在我的开发人员工作站上,此代码可以阻止我启动该程序的多个实例。但是,QA 有一个 Citrix 测试环境,每个用户仍然能够启动多个实例。
如何防止给定用户在 Citrix 中运行多个实例?
[STAThread]
static void Main(string[] args)
{
bool isFirstInstance;
Mutex m = new Mutex(true, "[App name goes here] mutex", out isFirstInstance);
if (isFirstInstance)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run();
// Prevent the just-in-time (JIT) compiler from optimizing away our Mutex.
// See: http://www.ai.uga.edu/mc/SingleInstance.html
GC.KeepAlive(m);
}
}
Run Code Online (Sandbox Code Playgroud)
出于技术原因,我们希望限制实例数量。该程序使用自承载 WCF 与同一用户运行的另一个进程进行通信。我们只希望每个用户有一个该程序的实例。
我不知道有关 Citrix 环境的任何详细信息,但可以询问。
谢谢。
我有一个记录到文件的类.这个类由多个线程使用.我在write函数中使用了一个互斥锁,它可以在我的应用程序的一个实例中正常工作.但如果我启动应用程序的多个实例,它就会崩溃.
什么是类级别的命名互斥体的正确实现,可以跨进程工作.
过去我做过这样的事情
private static bool AlreadyRunning()
{
var processes = Process.GetProcesses();
var currentProc = Process.GetCurrentProcess();
logger.Info($"Current proccess: {currentProc.ProcessName}");
foreach (var process in processes)
{
if (currentProc.ProcessName == process.ProcessName && currentProc.Id != process.Id)
{
logger.Info($"Another instance of this process is already running: {process.Id}");
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
哪个效果很好。在新的dotnet核心世界中,所有内容的进程名称都为,dotnet因此我一次只能运行一个dotnet应用程序!不是我想要的:D
在dotnet中有理想的方法吗?我看到了建议的互斥锁,但是我不确定我是否理解在Windows机器以外的其他系统上运行的可能的缺点或错误状态。
我有一个 C# 程序,我希望其中的某些功能需要管理员密码。为了解决这个问题,我启动了应用程序的另一个实例作为提升的进程,并向其传递命令行参数,以便该进程知道它必须执行什么任务。
Process proc = new Process();
proc.StartInfo.Arguments = "PARAMETERS HERE");
proc.StartInfo.FileName = Application.ExecutablePath;
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.Verb = "runas";
proc.Start();
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我有一个小问题。我刚刚注意到启动新进程时弹出的 UAC 提示符不仅显示应用程序名称和路径,还显示传递给它的命令行参数。这样,用户可以看到正在传递的参数,并直接从run命令或传递参数command prompt。
有什么办法可以防止这种情况吗?或者提升正在运行的程序的更好方法?