Попробуйте:
<input type="submit" style="position: absolute; left: -9999px"/>
Это приведет к нажатию кнопки waaay влево, вне экрана. Хорошая вещь с этим - вы получите грациозное ухудшение при отключении CSS.
Обновление - обход для IE7
Как было предложено Брайаном Даунинг + с помощью tabindex
, чтобы предотвратить вкладку нажмите эту кнопку (Ates Goral):
<input type="submit"
style="position: absolute; left: -9999px; width: 1px; height: 1px;"
tabindex="-1" />
C # с именем EventWaitHandle - путь сюда. Создайте экземпляр дескриптора ожидания в каждом процессе, который хочет использовать этот файл, и дайте ему имя, которое будет использоваться всеми этими процессами.
EventWaitHandle waitHandle = new EventWaitHandle(true, EventResetMode.AutoReset, "SHARED_BY_ALL_PROCESSES");
Затем при доступе к файлу подождите waitHandle
и когда законченный файл обработки, установите его таким образом, чтобы следующий процесс в очереди мог получить к нему доступ.
waitHandle.WaitOne();
/* process file*/
waitHandle.Set();
Когда вы называете дескриптор ожидания события, это имя является общим для всех процессов в операционной системе. Поэтому, чтобы избежать возможности столкновений, используйте руководство для имени («SHARED_BY_ALL_PROCESSES» выше).
C # имеет встроенный lock
, и вы можете использовать его, создав статический объект, для которого все потоки имеют доступ к:
private static object lockObject {get;set;}
public static object LockObject {get{return lockObject ?? lockObject = new object();}}
void YourMethod()
{
lock(LockObject) // all other threads will wait for y
{
using(var lockFileStream = File.Open("Lock.txt", FileMode.Open, FileAccess.Read, FileShare.None))
{
//Do what you need with the file.
}
}
}
Это создает подход Thread Thread для вашей проблемы.
Мьютекс в C # может использоваться для нескольких процессов. Вот пример для нескольких процессов, записывающих в один файл:
using (var mutex = new Mutex(false, "Strand www.jakemdrew.com"))
{
mutex.WaitOne();
File.AppendAllText(outputFilePath,theFileText);
mutex.ReleaseMutex();
}
Вам нужно убедиться, что мьютексу присвоено уникальное имя, которое будет совместно использоваться во всей системе.
Дополнительное чтение здесь:
Если бы это был я, я бы установил что-то вроде SQL Server Compact Edition для чтения / записи этих данных.
Однако, если вы хотите блокировать доступ к ресурсу, который делится между несколькими процессов, вам нужно использовать Mutex или семафор.
Класс Mutex - это .Net-оболочка вокруг механизма блокировки уровня OS.
Ваше решение подвержено ошибкам. Вы в основном реализовали блокировку с двойным проверкой ( http://en.wikipedia.org/wiki/Double-checked_locking ), которая может быть очень опасной.
Лучшее решение чтобы либо вводить изоляцию потоков, когда только один поток когда-либо обращается к файлу, и делает это, читая из очереди, по которой запросы на чтение или запись помещаются другими потоками (и, конечно, очередь защищена взаимоисключающим доступом по потокам) или где потоки синхронизируются либо с помощью устройств синхронизации (секции lock
, либо mutotes, либо), либо с использованием какой-либо другой логики доступа к файлу (например, System.IO.FileShare
).
using (var handle = new EventWaitHandle(...)){handle.WaitOne(); ... handle.Set();}
, или я должен обернуть все вtry{..}finally{handle.Set();}
? Будет лиDispose()
установить дескриптор свободным? – dmigo 5 January 2016 в 16:18if(waitHandle.WaitOne())) try{ ...}finally{waitHandle.Set();}
В случае исключений – schoetbi 28 November 2016 в 13:08