Есть CL(command line) приложение, в качестве формы выводится форма для настроек. Так вот, при попытке вызвать второй раз форму отображается сообщение "мол, форма запущена".При другом раскладе, когда переданы данные и запускается процесс - нужно мне сделать так, чтобы можно было запускать не один процесс а несколько. Объяснил как мог. Можно ли как-то узнать -запущена именно UI или нет. Может, можно процессу назначить какой-то уникальный ID?
Возьмем класс из этого ответа
class SingleGlobalInstance : IDisposable
{
//edit by user "jitbit" - renamed private fields to "_"
public bool _hasHandle = false;
Mutex _mutex;
private void InitMutex()
{
string appGuid = ((GuidAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), false).GetValue(0)).Value;
string mutexId = string.Format("Global\\{{{0}}}", appGuid);
_mutex = new Mutex(false, mutexId);
var allowEveryoneRule = new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.FullControl, AccessControlType.Allow);
var securitySettings = new MutexSecurity();
securitySettings.AddAccessRule(allowEveryoneRule);
_mutex.SetAccessControl(securitySettings);
}
public SingleGlobalInstance(int timeOut)
{
InitMutex();
try
{
if (timeOut < 0)
_hasHandle = _mutex.WaitOne(Timeout.Infinite, false);
else
_hasHandle = _mutex.WaitOne(timeOut, false);
if (_hasHandle == false)
throw new TimeoutException("Timeout waiting for exclusive access on SingleInstance");
}
catch (AbandonedMutexException)
{
_hasHandle = true;
}
}
public void Dispose()
{
if (_mutex != null)
{
if (_hasHandle)
_mutex.ReleaseMutex();
_mutex.Close();
}
}
}
Но вызывать его будем только в том случае, если наша программа запущена без параметров. Вообще наше консольное приложение эмулирует какую то работу если ему передают параметры (не важно какие) или открывает форму если его вызвали без параметров. При открытии формы идет попытка захватить мьютекс, если попытка не удалась - то мьютекс уже захвачен и прекращаем работу. таким образом простая работа может быть запущена сколько угодно раз, окно настроек - только 1 инстанс одновременно
Код:
[STAThread]
static void Main(string[] args)
{
if (args?.Length > 0)
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine($"Deleting files in progress: {i}%");
Thread.Sleep(1000);
}
}
else
{
try
{
using (var mutex = new SingleGlobalInstance(0))
{
var wnd = new Window();
wnd.Title = "Settings";
wnd.Content = new Label() {Content = "I am settings window"};
wnd.Width = 300;
wnd.Height = 300;
wnd.WindowStartupLocation = WindowStartupLocation.CenterScreen;
wnd.ShowDialog();
}
}
catch (TimeoutException)
{
Console.WriteLine("Settings window already opened!");
}
}
}
Результат:
Виртуальный выделенный сервер (VDS) становится отличным выбором
Меня интересует может ли generic класс принимать несколько типов параметров, а точнее которое заранее неизвестно, как тот же кортеж?
Для ограничения доступа к ячейкам EXCEL через C# применяю метод WorksheetProtection
Есть 2 ViewModel это LoginViewModel и AuthViewModel В AuthViewModel идет инициализация и вызов делегата при срабатывании команды