Так что я пишу (или более конкретно добавляя) в DLL-файл, чтобы он мог вызывать функцию каждую секунду, функция будет передавать некоторые данные в файл который затем может быть прочитан другой программой. Проблема заключается в том, что я не смог найти какие-либо системы синхронизации, которые не связаны с формой или консольным приложением, я просто хочу, чтобы это произошло в любом графическом интерфейсе (или любом пользовательском интерфейсе)! Я заглянул в system.timers.timer, но форма, которую я могу сказать, нуждается в консоли и. Возможно ли это? и если да, то как? Заранее спасибо :-)Повторяя даже каждую секунду в DLL (C#)
ответ
Вы можете использовать System.Threading.Timer
Там нет необходимости для графического интерфейса, если это просто предназначено быть фоновое приложение. Все зависит от того, как он размещается (см. Мой комментарий к вашему оригинальному сообщению о тихом exe vs service).
Вот основной учебник, который может быть полезен: http://www.dotnetperls.com/timer
внимание также этот предыдущий вопрос, который очень похож: How to call a particular method every some seconds in c#?
Как Дмитрий также предложил, когда я печатаю это, я бы посоветовал продолжить это на фоновом потоке, так как это звучит так, будто есть некоторая обработка, необходимая для создания файла. Ваш основной код должен просто установить программу, а затем запустить новый поток, чтобы выполнять работу каждую секунду (1000 миллисекунд).
Информация на этом классе здесь: https://msdn.microsoft.com/en-us/library/system.threading.timer(v=vs.110).aspx
страница MSDN содержит твердый пример того, как использовать класс. В этом примере используется метод StatusChecker.CheckStatus. Эта функция задается с линией:
TimerCallback tcb = statusChecker.CheckStatus;
Линия два после этого один запускает таймер, и указывает на то, что обратный вызов должен быть поднят через 1 секунду и каждую 1/4 секунды после этого:
Timer stateTimer = new Timer(tcb, autoEvent, 1000, 250);
С прилагаемой документацией и этим примером вы сможете определить, как внести необходимые изменения.
Огромное спасибо :-) Я вообще не хотел использовать графический интерфейс, так что это прекрасно. Эта ссылка на microsoft кажется действительно полезной, я посмотрю на нее, спасибо :-) –
Что загрузит эту dll - если служба окон; вы можете инициировать объект таймера в событии service.start; а затем поместите свою повторяющуюся функцию в timer.event. Вот некоторые псевдо-код, чтобы вы начали:
Declare это глобально:
System.Timers.Timer tmrMain = new System.Timers.Timer();
Тогда в функции Main() установить интервал - частота, на которой вы хотите, чтобы ваши функции, которые можно назвать:
tmrMain.Interval = 20000; //in milliseconds
tmrMain.Start();
И вы должны также объявить обработчик события:
private void tmrMain_Tick(object sender, System.Timers.ElapsedEventArgs e)
{
//Your call to do something, every time this gets triggered at value specified in tmrMain.Interval
}
Надежда это он LPS.
Спасибо :-) Я использую медиа-плеер под названием MusicBee, и вы можете добавить в него DLL-плагины, поэтому я бы предположил, что это будет MusicBee, запускает DLL. Я думал о том, чтобы положить его в бесконечный цикл с вызовом сна, чтобы разбить его, вы думаете, что это сработает? –
Как будут функционировать функции, представленные в этой библиотеке? Будет ли эта DLL использоваться в исполняемом файле, который запускается вручную или запланирован как часть службы, размещенной в планировщике, таком как службы Windows или подобное? –
Почему вы думаете, что System.Timers.Timer (https://msdn.microsoft.com/en-us/library/393k7sb1% 28v = vs.110% 29.aspx) требуется консоль? – BadZen
Я использую музыкальный плеер MusicBee, который позволяет использовать DLL-плагины, DLL-файл имеет части: тот, который захватывает данные из API MusicBee и один для сервера (чтобы я мог видеть данные на веб-странице). В основном это все необходимо обрабатывать внутренне, поскольку флаги активации, включенные в API, не выполняют то, что мне нужно. Я думал об использовании бесконечного цикла с вызовом сна 500. Будет ли это работать? –