Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
 Аватар для ember74
9 / 8 / 2
Регистрация: 07.10.2015
Сообщений: 510

Последовательное выполнение потоков

29.03.2017, 15:47. Показов 2770. Ответов 7

Студворк — интернет-сервис помощи студентам
Господа, очень нужна ваша помощь, бьюсь уже третий день...
1. Необходимо чтобы сперва выполнялся метод upload, а после него replace. Т.е. переносить файлы только тогда, когда они загружены на ftp-сервер.
2. Если выдает ошибку подключения типа: Timeout occurs или Transfering was timeout, то метод replace вообще не выполняем.

Сейчас делаю так:

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using BytesRoad.Net.Ftp;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
 
 
class sFTP
{
    Mutex mutex = new Mutex();
    
    public static void upload()
        {
            try
            {
                sFTP sftp = new sFTP();
                sftp.mutex.WaitOne();
                FtpClient ftp = new FtpClient();
                ftp.PassiveMode = true;
                int TimeOUT = 1000;
                ftp.Connect(TimeOUT, "хост", 21);
                ftp.Login(TimeOUT, @"логин", "пароль");
 
                var dirLocal = new DirectoryInfo(@"путь");
                foreach (FileInfo file in dirLocal.GetFiles())
                {
                    string fileName = Path.GetFileNameWithoutExtension(file.FullName) + Path.GetExtension(file.FullName);
                    ftp.PutFile(TimeOUT, "путьнафтп" + fileName, @"локальныйпуть" + fileName);
                    Console.WriteLine("Файл - " + fileName + " " + "загружен на FTP сервер");
                    Thread.Sleep(100);
                }
                ftp.Disconnect(TimeOUT);
                sftp.mutex.ReleaseMutex();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
 
        public static void replace()
        {
            try
            {
                sFTP sftp = new sFTP();
                sftp.mutex.WaitOne();
                var dir = new DirectoryInfo(@"локальныйпуть");
                if (dir.GetFiles().Length > 0)
                {
                    foreach (FileInfo file in dir.GetFiles())
                    {
                        string fileName = Path.GetFileNameWithoutExtension(file.FullName) + Path.GetExtension(file.FullName);
                        string spath = @"путь" + fileName; //Откуда перемещаем
                        string dpath = @"путь" + fileName; //Куда перемещаем
                        File.Move(spath, dpath);
                        Console.WriteLine("Файл - " + fileName + " " + "перемещен");
                        Thread.Sleep(100);
                    }
                }
                sftp.mutex.ReleaseMutex();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
}
 
 
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Thread upload = new Thread(sFTP.upload);
                Thread replace = new Thread(sFTP.replace);
                upload.Start();
                replace.Start();
            }
            catch (Exception ex)
            {
                Console.WriteLine();
            }
 
            Console.ReadKey();
        }
    }
Будьте добры, укажите на мою ошибку
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.03.2017, 15:47
Ответы с готовыми решениями:

Последовательное выполнение потоков
Здравствуйте. Есть два потока. Каждый меняет значение определенного ProgressBar`a. Как сделать так, чтоб второй ProgressBar начал...

Отслеживать последовательное выполнение кода для его анализа
Здравствуйте уважаемые. Решил изучать С net или хотябы приобрести необходимые навыки для написания программы для приема и посылки данных...

Поочередное выполнение потоков
Есть задача из основного потока вызываются 2 дополнительных для вывода информации на экран 10 раз (скажем поток 1 печатает 10 раз...

7
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
29.03.2017, 16:43
Цитата Сообщение от ember74 Посмотреть сообщение
Будьте добры, укажите на мою ошибку
Цитата Сообщение от ember74 Посмотреть сообщение
C#
1
2
3
4
Thread upload = new Thread(sFTP.upload);
Thread replace = new Thread(sFTP.replace);
upload.Start();
replace.Start();
У тебя эти потоки выполняются ОДНОВРЕМЕННО.
Гугли синхронизацию потоков.
Можно делать с помощью AutoResetEvent, можно организовать очередь задач, можно для Task`ов задать последовательное выполнение с помощью ContinueWith. Вариантов просто море. На лицо пробелы в теории многопоточного программирования. За тебя, конечно, можно написать программу, но лучше будет, если сам разберёшся. Лучше для тебя самого.
Лично мне очень помог этот ресурс. До сих-порт периодически на него заглядываю.
0
 Аватар для ember74
9 / 8 / 2
Регистрация: 07.10.2015
Сообщений: 510
30.03.2017, 08:51  [ТС]
aquaMakc, Нашел решение проблемы через Task
C#
1
2
3
4
5
6
7
8
9
10
       static void Main(string[] args)
        {
                var upload = Task.Factory.StartNew(() => {
                    upload();
                });
 
                Task replace = upload.ContinueWith((antecedent) => {
                    replace();
                });
       }
Если я ошибаюсь, поправьте меня) С потоками пару дней назад начал работать

Добавлено через 8 минут
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
30.03.2017, 08:55
Цитата Сообщение от ember74 Посмотреть сообщение
Если я ошибаюсь, поправьте меня)
если работает, то и поправлять нечего. Шарп предлагает очень много вариантов многопоточного и асинхронного программирования. Это только один из них.
0
 Аватар для ember74
9 / 8 / 2
Регистрация: 07.10.2015
Сообщений: 510
31.03.2017, 10:17  [ТС]
aquaMakc, А вы не подскажите, как узнать, что upload выполнился успешно? Я тестировал код программы, и ситуация такая, что если нет соединения с ftp-сервером или указан несуществующий путь до папки, начинается выполнение метода replace. А нужно, чтобы он начинал выполняться только после успешной загрузки файлов на сервер. Подскажите хотя бы в какую сторону копать.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
31.03.2017, 10:21
ember74, опять-же вариантов много. Например, можно не выносить эти задачи по разным таскам, а выполнять в одном последовательно с проверкой условия.
0
 Аватар для ember74
9 / 8 / 2
Регистрация: 07.10.2015
Сообщений: 510
31.03.2017, 10:45  [ТС]
Цитата Сообщение от aquaMakc Посмотреть сообщение
последовательно с проверкой условия
Именно то, что мне нужно. Вы можете пример привести? А то я конкретно в тупик зашел..
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
31.03.2017, 11:26
Цитата Сообщение от ember74 Посмотреть сообщение
Вы можете пример привести?
Откровенно лениво писать код, суть такая:
Это конечный автомат на switch. Для него определены состояния. Лучше всего для этого использовать enum. Конечный автомат выполняется в отдельном от UI потоке (Task`е). Выполнение его зациклено либо на постоянку, либо с проверкой условия. При запуске потока ты указываешь состояние автомата, например, UPLOAD. switch выполняет соответствующий case, в котором проверяется выполнение метода upload(). Если всё хорошо - состояние меняется на REPLACE и код уходит на второй цикл. Если нет - завершение работы потока.
Во втором цикле выполняется case и метод replace() по окончании которого либо завершение потока, либо переключение автомата в другое состояние.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.03.2017, 11:26
Помогаю со студенческими работами здесь

Параллельное выполнение потоков
Привет всем. Знаю что тема избитая уже, но что то не выходит все равно. Суть в том что в обработчике события есть 2 потока. Один поток...

Массив потоков. Максимально быстрое выполнение
Добрый день. Стоит такая задача: Максимально быстро циклически выполнять определенный метод в течение некоторого времени. Сам...

Последовательное выполнение кода
Как можно реализовать последовательность выполнения кода Пока 1 часть не завершит выполнение, например calculate(); не выполнять abc();

Последовательное выполнение нескольких Assert
Всем привет. Прошу подсказать, как внутри тестовой функции реализовать последовательное выполнение нескольких функций ...

Последовательное выполнение процессов с ожиданием завершения каждого
Имеется 2 процесса, которые должны выполняться один за другим. Первый - объединение нескольких файлов .odt в один: Process cat = new...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru