Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676

Как заставить ожидать выполнения метода

13.09.2021, 15:43. Показов 1511. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня!

есть метод который следит за изменением файлов в каталоге

C#
1
2
3
4
FileSystemWatcher fsw = new FileSystemWatcher(@"E:\\doc\\"); //следим за d:\1.txt
            fsw.Changed += new FileSystemEventHandler(fsw_Changed);
            fsw.EnableRaisingEvents = true;
            fsw.IncludeSubdirectories = true;
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
static void fsw_Changed(object sender, FileSystemEventArgs e)
        {
            string extensionFile = "";
            string nameFile = "";
            FileInfo fileInf = new FileInfo(e.FullPath);
            if (fileInf.Exists)
            {
                extensionFile = fileInf.Extension;
                nameFile = fileInf.Name.Replace(extensionFile, "");
            }
 
            string patchFole = e.FullPath;
            string filename = nameFile;
            string extension = extensionFile.Replace(".", ""); ;
            string statusfole_ = e.ChangeType.ToString();
 
            byte[] inData = File.ReadAllBytes(patchFole);
            string srtingData = Convert.ToBase64String(inData);
            //typesfiles = 1 = Файл / 2 = Портал ЭСЧФ / 3 = Портал ФСЗН / 4 = Плательщик ЕАЭС / 5 = Откравка платежных поручений в интернет банк
            FilesInfos FilesInfos = new FilesInfos
            {
                Files = new List<FileInfo_>
                {
                    new FileInfo_
                    {
                        Name = filename,
                        expansion = extension,
                        datafiles = srtingData,
                        typesfiles = "1",
                        statusfole = statusfole_
                    }
                }
            };
 
            if (extensionFile != "")
            {
                var json = JsonConvert.SerializeObject(FilesInfos);
 
 
 
                var iTextBytes = System.Text.Encoding.UTF8.GetBytes(json);
                string e1 = Convert.ToBase64String(iTextBytes);
 
 
                bool gg = false;
  
                while (tt.Starts_(e1) != true)
                {
                    
                  
                }
 
                    
               
 
 
            }
        }
здесь
C#
1
tt
это метод класс там он подключается один раз к клиенту и должен отсылать ему файлы

но метод fsw_Changed должен ожидать пока не вышлет предыдущий файл и затем только высылать другой как это реализовать?

Добавлено через 2 минуты
я пробовал создавать новый экземпляр класса но и тут он получается в разных потоках начинает коннектится к клиенту и все приложение отваливается

смысл таков как должно быть

метод fsw_Changed как я понимаю асинхронный верно?

как только изменяется файлы в директории он выполняется в новом потоке так?

следовательно мне необходимо что бы он пока tt.Starts_(e1) не вернул истину должен ожидать и только когда tt.Starts_(e1) = итине тогда посылать следующий файл
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.09.2021, 15:43
Ответы с готовыми решениями:

Как заставить поток ожидать любого события?
Делаю класс по гайду с msdn вот. Но немного переделал, так что бы было похоже на BackgroundWorker. По факту есть события: public...

Остановить и продолжить выполнение метода. Общий поток при этом должен ожидать
Всем привет! Есть метод 1, который выполняется и останавливается в процессе, затем выполняется метод 2, когда он завершается, то...

Как заставить ожидать пока WebBrowser1.DocumentText будет равен HTML_DOC
есть код: WebBrowser1.DocumentText = HTML_DOC WebBrowser1.ShowPrintPreviewDialog() дело в том что WebBrowser не...

14
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3403 / 2725 / 574
Регистрация: 04.09.2018
Сообщений: 8,554
Записей в блоге: 3
13.09.2021, 15:45
На время ожидания делайте
C#
1
fsw.EnableRaisingEvents = false;
и потом обратно в true.
0
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676
13.09.2021, 15:49  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
На время ожидания делайте
C#Выделить код
1
fsw.EnableRaisingEvents = false;
и потом обратно в true.
а он разве не перестанет слушать?

я имею в виду пока отправляется файл мне нужно что бы он как бы запоминал другие измененные файлы и только после того как отправил отсылал накопленные
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3403 / 2725 / 574
Регистрация: 04.09.2018
Сообщений: 8,554
Записей в блоге: 3
13.09.2021, 15:52
Sanya2019, я делал так:
fsw.Changed фиксирует файлы, записывая их в некий List. Другая функция отправляет из этого листа в сеть, пока он не закончится. Т.е. сам fsw.Changed тут не принимает участия, а делает свою работу.
0
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676
13.09.2021, 16:12  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Sanya2019, я делал так:
fsw.Changed фиксирует файлы, записывая их в некий List. Другая функция отправляет из этого листа в сеть, пока он не закончится. Т.е. сам fsw.Changed тут не принимает участия, а делает свою работу.
ничего не понял

я установил в ложь EnableRaisingEvents перед тем ка котправить затем отправил файл и выставил сново EnableRaisingEvents в истину но на момент отправки файла скопировал в каталог еще порцию файлов и в итоге после не получил вообще ничего
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3403 / 2725 / 574
Регистрация: 04.09.2018
Сообщений: 8,554
Записей в блоге: 3
13.09.2021, 16:17
Цитата Сообщение от Sanya2019 Посмотреть сообщение
я установил в ложь EnableRaisingEvents
Этого делать не надо в свете вашего дополнения к вопросу.
fsw.Changed() пусть работает всегда, собирая файлы в список. Функция, отвечающая за отправку проверяет этот список, и если он не пустой - отправляет из него в сеть.
0
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676
13.09.2021, 16:23  [ТС]
кажется допер

Вы имеете в виду

static List<String> named { get; set; }

далее в fsw.Changed() добавляю в него данные

а в каждые nn секунд проверяю этот List и если в нем етсь что тогда отправляю и при удачном исходе удаляю отправленную запись так?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3403 / 2725 / 574
Регистрация: 04.09.2018
Сообщений: 8,554
Записей в блоге: 3
13.09.2021, 16:25
Цитата Сообщение от Sanya2019 Посмотреть сообщение
а в каждые nn секунд проверяю этот List и если в нем етсь что тогда отправляю и при удачном исходе удаляю отправленную запись так?
примерно так, да. В зависимости от того, как быстро этот список наполняется, возможны два варианта развития событий... Либо удалять из него текущий файл сразу после отправки, либо очищать список полностью после отправки всей пачки.
0
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676
13.09.2021, 16:54  [ТС]
что то морожу уже(

помогите создать этот лист (

Добавлено через 2 минуты
я объявил

C#
1
 static List<String> Nameds { get; set; }
далее прописал в методе fsw.Changed()

C#
1
 Nameds.Add(e1);
в итоге получаю ошибку (

System.NullReferenceException: "Ссылка на объект не указывает на экземпляр объекта."

WidgetNS.ServersList.Nameds.get вернул null.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3403 / 2725 / 574
Регистрация: 04.09.2018
Сообщений: 8,554
Записей в блоге: 3
13.09.2021, 18:04
Цитата Сообщение от Sanya2019 Посмотреть сообщение
"Ссылка на объект не указывает на экземпляр объекта."
C#
1
Nameds = new List<string>();
Добавлено через 48 секунд
В конструкторе класса инициализируйте List.
1
13 / 10 / 5
Регистрация: 22.03.2021
Сообщений: 50
13.09.2021, 21:50
Цитата Сообщение от wizard41 Посмотреть сообщение
Sanya2019, я делал так:
fsw.Changed фиксирует файлы, записывая их в некий List. Другая функция отправляет из этого листа в сеть, пока он не закончится. Т.е. сам fsw.Changed тут не принимает участия, а делает свою работу.
А если используется не только поле Changed?

Можно ли этот код как-то сократить?

watcher.Created += AddToList;
watcher.Deleted += AddToList;
watcher.Changed += AddToList;
watcher.Error += Watcher_Error;
watcher.Renamed += AddToList;
watcher.Disposed += Watcher_Disposed;

А ошибка с List у него в том что он берет List<string> а надо List<EventArgs>

Добавлено через 35 минут
Цитата Сообщение от Sanya2019 Посмотреть сообщение
C#
1
fsw.Changed += new FileSystemEventHandler(fsw_Changed);
Цитата Сообщение от Sanya2019 Посмотреть сообщение
я пробовал создавать новый экземпляр класса но и тут он получается в разных потоках начинает коннектится к клиенту и все приложение отваливается
Ну код так написан, с оператором new, поэтому при каждом срабатывании и создается новый FileSystemEventHandler.

Как было выше сказано, метод fsw_Changed нужно заменить примерно на:

C#
1
2
3
4
5
6
7
        private void fsw_Event(Object sender, EventArgs args)
        {
            if (Nameds.Count == 0 || Nameds[Nameds.Count - 1] != args)
            {
                Nameds.Add(args);
            }
        }
где Nameds -
C#
1
public List<EventArgs> Nameds;
А дальше уже fsw_Changed должен брать записи из списка, обрабатывать их и удалять обработанные в то время, как FileSystemWatcher будет заботиться о том, чтобы добавлять в список новые записи.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3403 / 2725 / 574
Регистрация: 04.09.2018
Сообщений: 8,554
Записей в блоге: 3
14.09.2021, 09:32
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
        static void Main( string[] args )
        {
            FileSystemWatcher fsw = new FileSystemWatcher( @"C:\TestFolder\" )
            {
                Filter = "*.txt",
                NotifyFilter = NotifyFilters.FileName
            };
 
            fsw.Created += Event;
            fsw.Deleted += Event;
            fsw.Changed += Event;
            fsw.Renamed += Event;
            fsw.EnableRaisingEvents = true;
 
            Console.Read();
        }
 
        static void Event( object sender, FileSystemEventArgs e )
        {
            switch ( e.ChangeType )
            {
                case WatcherChangeTypes.Created :
                    {
                        //....
                    }
                    break;
 
                case WatcherChangeTypes.Deleted :
                    {
                        //...
                    }
                    break;
 
                case WatcherChangeTypes.Changed :
                    {
                        //...
                    }
                    break;
 
                case WatcherChangeTypes.Renamed :
                    {
                        //...
                    }
                    break;
            }
             Console.WriteLine( $"File {e.Name} is {e.ChangeType}" );
        }
Примерно так.
2
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676
15.09.2021, 09:06  [ТС]
Все получилось!

пришлось правда сохронять в Sqlite данные по изменениям так как при выходе с сервера виртуальный канал закрывается и следовательно если клиент не вернул "ок" значит текущий файл небыл передан а значит необходимо допонительно после следующего подключения отправить его

и только после того как клиент вернет подтверждение о том что съел файл только тогда стираю из бд запись

тепреь вот пишу то же и на клиенте так как обмен то должен быть двухсторонним )
0
13 / 10 / 5
Регистрация: 22.03.2021
Сообщений: 50
15.09.2021, 20:20
Цитата Сообщение от Sanya2019 Посмотреть сообщение
пришлось правда сохронять в Sqlite данные по изменениям так как при выходе с сервера виртуальный канал закрывается и следовательно если клиент не вернул "ок" значит текущий файл небыл передан а значит необходимо допонительно после следующего подключения отправить его
Может, пригодится
https://qastack.ru/programming... ked-in-net
1
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676
16.09.2021, 10:41  [ТС]
Цитата Сообщение от TrickyShot Посмотреть сообщение
Может, пригодится
Возможно, если бы я не юзал виртуальный канал RDP :-(

Добавлено через 44 секунды
с другой стороны а вдруг нет ушел гулять? комп выключился и т д

полюбому надо как то мониторить факт передачи

Добавлено через 20 минут
Хотя,,. возможно Вы мне поможете

Общение по виртуальному каналу я брал из примера

вот код который с сервера отправляет данные

возможно ли переписать этот код на отправку не строки а байтов?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[DllImport( "wtsapi32.dll", ExactSpelling=true, SetLastError=true )]
        private static extern bool WTSVirtualChannelWrite( IntPtr hChannelHandle, IntPtr Buffer, UInt32 Length, ref UInt32 pBytesWritten );
 
        public static void WTSVirtualChannelWrite( IntPtr hChannelHandle, String sBuffer )
        {
            UInt32 pBytesWritten = 0;
            IntPtr buffer = Marshal.StringToHGlobalUni( sBuffer );
            if( !WtsApiWrapper.WTSVirtualChannelWrite( hChannelHandle, buffer, Convert.ToUInt32( (sBuffer.Length + 1) * 2 ), ref pBytesWritten ) )
            {
                Marshal.FreeHGlobal( buffer );
                int iRet = Marshal.GetLastWin32Error();
                throw new System.ComponentModel.Win32Exception( iRet );
            }
            Marshal.FreeHGlobal( buffer );
        }
Добавлено через 25 минут
В общем вышло у меня все же упаковать данные и отправить но и тут проблема клиентская часть принимает только строку и хоть убей (

короче надо подумать буду пока все же пистаь на строке а потом уже придумаю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.09.2021, 10:41
Помогаю со студенческими работами здесь

Как запустить внешнюю программу и не ожидать ее выполнения?
Как запустить внешнюю программу и не ожидать ее выполнения? RunCommand ждет пока запущенное приложене не закроекся, а Shellexecuteex...

Программа "Торпедная атака": Как заставить программу всё время цикла "Корабль" ожидать нажатия клавиши
Задача : по х кординате на экране движется корабль. При нажатии клавиши &quot;F&quot; запускается торпеда, которая попадёт или не попадёт в данный...

Как заставить Builder 6 показывать результат выполнения программы?
У меня C++ Builder 6. Написал простую программу, например &quot;Hello, Word!&quot;, нажимаю Run (F9). Пишет, что эроров ноль, но черное окно с...

Как заставить макрос после выполнения переходить на следующую ячейку
Имееться макрос для полученя веса GetStaticWeight. после выполнения он записывает в ячейку А1 вес. КАК ЗАСТАВИТЬ МАКРОС ПОСЛЕ ВЫПОЛНЕНИЯ...

Как заставить make продолжать выполнения после failed recipe?
Я знаю о замене rm соответствующей встроенной переменной $(RM), но мне нужно универсальное решение типа '-' префикса перед командой. Да, я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru