super_user Ответов: 1

Разница во времени консольное приложение C#


Я пытаюсь создать приложение . сценарий заключается в том, что у меня есть папка в этой папке, когда кто-то получает доступ / создает файл каждые 5 минут, если кто-то не может создать файл с помощью 5 минут, то я хочу отправить sms. отправка sms-это не проблема .. проблема в том, что sms идет с in 5 mint даже файл создается .. как кто-то создает файлы и все еще sms идет, но я хочу, когда кто-то не может получить доступ к папке с in 5 mint, то после 5 mint я хочу отправить sms .

Что я уже пробовал:

public static void Main()
       {

           while (true)
           {
               try
               {


                   string abcPath,

                   abcPath= ConfigurationManager.AppSettings.Get("abcPath");


                   DirectoryInfo dir = new DirectoryInfo(abcPath);
                   dir.Refresh();


                   DateTime abc = File.GetLastAccessTime(abcPath);


             Console.WriteLine("the  time for  abc {0}", abc );


                   TimeSpan timediff = DateTime.Now - abc ;




                   if( timediff.TotalMinutes > 5)
                   {
                       Dt db = new Dt();
                       var  u = db.tblurgent;
                       foreach (var a in u)
                       {
                           tbl_OutBox tb = new tbl_OutBox();
                           tb.FromSIM_No = a.SimNo;
                           tb.ToSIM_No = a.SimNo;
                           tb.ToText = "Check abc";
                           tb.Reply = "NA";
                           tb.Response = "NA";
                           tb.RegNo = "NA";
                           tb.Datetd = DateTime.Now;
                           tb.FFID = "NA";
                           tb.UserId = "You";
                           tb.FromText = "Check abc";
                           db.tbl_OutBoxes.InsertOnSubmit(tb);
                           db.SubmitChanges();
                       }
                   }

Philippe Mori

Совершенно бесполезно показывать код для обоих abc и def поскольку это не поможет нам решить вашу проблему. Это зависит от вас, чтобы дать минимальный код, необходимый для воспроизведения проблемы.

1 Ответов

Рейтинг:
12

Philippe Mori

DirectoryInfo связанные с этим вещи кажутся бесполезными в вашем коде.

В вашем коде нет кода, который отправляет SMS, поэтому невозможно сказать вам, в чем проблема. Однако вам было бы очень легко поставить точку останова на коде, который действительно отправляет SMS, и посмотреть, почему отправляется сообщение.

Тем не менее, зачем вам проверять каждые 4 секунды? Если вам нужна такая точность, не будет ли использование FileSystemWatcher более уместным (Класс FileSystemWatcher (System.IO)[^])?

Я думаю, что одна из проблем с вашим кодом заключается в том, что вы добавляете элемент в таблицу каждые 4 секунды, поэтому вы отправите много SMS, если отправите по одному для каждой строки в таблице. Вам, вероятно,нужно запомнить, было ли отправлено SMS, и только одно отправлено, если не было отправлено ни одного SMS. В противном случае у вас было бы много сообщений для отправки.

Предполагая, что вы отправляете отдельные сообщения многим людям, вы также можете переполнить емкость своего почтового сервера в зависимости от того, как отправляются сообщения. Если это так, то он может продолжать отправлять электронную почту еще долго после того, как состояние предупреждения исчезнет.

Кроме того, некоторые строки не имеют правильного отступа, и пустые строки кажутся несколько произвольными. Это может не повлиять на результат, но программист должен быть профессионалом, который заботится о деталях.

Наконец, кажется, что вы не знаете сухого принципа (Не повторяйтесь - Википедия, свободная энциклопедия[^]). На самом деле очень легко заметить, что код для abcPath очень похоже на код для defPath Это очень плохо, так как все изменения, которые вы делаете для abcPath, вам придется повторить это для defPath и если вы добавите третий путь для проверки, это будет еще хуже.

Ваша функция имеет более чем одну ответственность. Вы когда-нибудь читали о твердых принципах (SOLID (объектно-ориентированный дизайн) - Википедия, свободная энциклопедия[^]). В вашем случае ваш код не уважает SRP (Принцип единой ответственности-Википедия, свободная энциклопедия[^]).

Еще одна проблема с вашим кодом заключается в том, что вы используете жестко закодированную константу в своем коде на протяжении всего времени. Если вы решите изменить продолжительность (скажем, 10 минут вместо 5), Вы должны найти каждое вхождение жестко закодированного значения 5 и посмотреть, связано ли это число с продолжительностью. Для крупных проектов было бы почти невозможно найти все такие значения. То же самое относится и к 4000 МС времени сна.

Любая Константа (за исключением тривиального случая, подобного 1 в некоторых обстоятельствах) должна быть объявлена таковой. Например:

const int maxDelayMinutes = 5;


Кроме того, когда время должно рассматриваться как одно и то же время, я бы предложил вам использовать переменную, чтобы сделать намерение ясным. Это могло бы избежать некоторых тонких ошибок, если бы время между вызовом DateTime.Now и код предполагает, что время точно такое же.

Такого рода проблемы гораздо проще отлаживать с помощью отладчика. Из такого вопроса мы можем только догадываться, что делает другой код (например, фактическая отправка SMS), но если проблема заключается в коде, который не показан, как мы можем ее угадать?

Кроме того, некоторая информация, такая как обеспечение правильного времени, имеет решающее значение. Например, если вы смешиваете местное и UTC время в своем коде, то оно может работать не так, как предполагалось. Такую проблему очень легко решить с помощью отладчика. Вы должны внести изменения в каталог, а затем шагнуть в свой код, чтобы увидеть, если timediff имеет ожидаемое значение. Обычно он работает по времени UTC и использует только местное время для отображения. На самом деле, этот код, вероятно, не будет работать так, как ожидалось, когда изменится летнее время.


Leo Chapiro

Очень хороший и ИМХО полезный ответ! +5

super_user

на самом деле msg отправляется из базы данных. здесь я просто вставляю строку в таблицу, и из этой таблицы отправляется msg.. когда я устанавливаю точку останова, я вижу, что 5 минут еще не закончились и данные отправляются в таблицу ... как я изменил код? @Филипп Мори

super_user

В вашем коде нет кода, который отправляет SMS, поэтому невозможно сказать вам, в чем проблема. Однако вам было бы очень легко поставить точку останова на коде, который действительно отправляет SMS, и посмотреть, почему отправляется сообщение.
------ sms отправляется из базы данных, так что забудьте об отправке sms--------


Тем не менее, зачем вам проверять каждые 4 секунды? Если вам нужна такая точность, не будет ли использование FileSystemWatcher более подходящим (класс FileSystemWatcher (System.IO) [^])?
-----да мне нужна именно такая точность, как я это делаю. я хочу проверить каждые 5 монетных дворов-------


Я думаю, что одна из проблем с вашим кодом заключается в том, что вы добавляете элемент в таблицу каждые 4 секунды, поэтому вы отправите много SMS, если отправите по одному для каждой строки в таблице. Вам, вероятно,нужно запомнить, было ли отправлено SMS, и только одно отправлено, если не было отправлено ни одного SMS. В противном случае у вас было бы много сообщений для отправки.
----да, это проблема отправки sms непрерывно .. когда я проверяю свой мобильный телефон, есть около 12 + sms .. где, как я хочу, когда файл не создается с помощью 5 секунд, то хочу вставить запись в таблицу только один раз ---


и я поставил адрес пути в приложение.файла config я.е.С:\Пользователи\администратор\рабочий стол\Азбука

Philippe Mori

Так или иначе, вам нужно иметь информацию в базе данных, чтобы знать, происходит ли изменение после последнего отправленного SMS. Или вы можете сохранить эту информацию в памяти, если вас не очень волнует эффект перезапуска консольного приложения.

Таким образом, если в какой-то момент обнаруживается изменение, вам нужно обновить информацию, чтобы после этого не отправлять SMS. Вам, вероятно,также нужно помнить, было ли отправлено SMS.

Учитывая, что вы не хотите рассказывать нам, как отправляются SMS-сообщения, то мы не можем помочь вам более точно, что дает некоторые общие идеи.

super_user

я не могу получить последний файл доступа к папке abc и def. где как сегодня 1-07-2016 когда я установил точку останова я получил дату 6/30/2016

Philippe Mori

Не публикуйте длинный неформатированный код и не публикуйте бесполезный код, но публикуйте весь необходимый код, чтобы понять проблему. Если у вас есть много новой информации, то обновите свой вопрос.

Philippe Mori

Вы также должны получить час и вид (локальный, UTC или неопределенный), чтобы убедиться, что вы действительно получаете время в ожидаемом часовом поясе.

Philippe Mori

Какова цель вызова DirectoryInfo. Refresh?

Вы обновляете каталог, но используете только файл, так что это не имеет особого смысла.

super_user

Directoryinfoкласс.Обновить? назначение этой папки обновляется каждые 2 месяца, поэтому я обновляю папку с помощью кода