Как организовать очередь потоков

276
04 апреля 2017, 08:54

Очень нужна помощь, подскажите пожалуйста, как сделать последовательное выполнение методов, сломал себе уже всю голову... Суть такая, есть метод Method_A и Method_B, они должны выполниться последовательно: сначала Method_A затем Method_B, причем если метод выдал ошибку, не выполнился, или возникли еще какие-либо проблемы, необходимо повторить выполнение метода. Очень надеюсь на Вашу помощь!

Метод А

static void download()
{
                Console.WriteLine("Beginning to download results..");
                FtpClient ftp = new FtpClient();
                sFTP sftp = new sFTP();
                ftp.PassiveMode = true;
                int TimeOUT = 1000;
                do
                {
                    ftp.Connect(TimeOUT, "host", 21);
                    ftp.Login(TimeOUT, @"log", "pass");
                }
                while (ftp.IsConnected == false);
                ftp.ChangeDirectory(TimeOUT, @"directory");
                foreach (FtpItem item in ftp.GetDirectoryList(TimeOUT))
                {
                    if (item.ItemType == FtpItemType.File && !System.IO.File.Exists(@"path" + item.Name))
                    {
                        ftp.GetFile(TimeOUT, @"path" + item.Name, @"path" + item.Name);
                        Console.WriteLine("Скачан файл - " + item.Name);
                    }
                }
                ftp.Disconnect(TimeOUT);
                Console.WriteLine("The results have been downloaded");
}

Метод В

static void upload()
        {
                Console.WriteLine("Beginning to upload files to FTP-server..");
                FtpClient ftp = new FtpClient();
                sFTP sftp = new sFTP();
                ftp.PassiveMode = true;
                int TimeOUT = 1000;
                do
                {
                    ftp.Connect(TimeOUT, "host", 21);
                    ftp.Login(TimeOUT, @"log", "pass");
                }
                while (ftp.IsConnected);
                var dirLocal = new DirectoryInfo(@"directory");и
                foreach (FileInfo file in dirLocal.GetFiles())
                {
                    string fileName = Path.GetFileNameWithoutExtension(file.FullName) + Path.GetExtension(file.FullName);
                    ftp.PutFile(TimeOUT, "path" + fileName, @"path" + fileName);
                    Console.WriteLine("Файл - " + fileName + " " + "загружен на FTP сервер");
                    string spath = @"path" + fileName; 
                    string dpath = @"path" + fileName; 
                    File.Move(spath, dpath);
                    Console.WriteLine("Файл - " + fileName + " " + "перемещен");
                }
                ftp.Disconnect(TimeOUT);
                Console.WriteLine("The files have been uploaded to FTP server");
        }
Answer 1

На самом деле, если смотреть на то, как Вы описали задачу, то потоки здесь действительно не при чём. Нужно просто в цикле выполнить несколько раз по очереди каждый метод. Дождавшись положительного результата выполнения, начать циклически выполнять второй метод. Если неудачным результатом выполнения метода считать возникшее в нём исключение, то можно решить задачу примерно так:

class Program
{
    static void MethodA()
    {
        Console.WriteLine("Executing method A");
        Thread.Sleep(1000);
        //раскомментируйте для проверки
        //throw new NotImplementedException("ERROR!");
        Console.WriteLine("Method A executed");
    }
    static void MethodB()
    {
        Console.WriteLine("Executing method B");
        Thread.Sleep(2000);
        //раскомментируйте для проверки
        //throw new NotImplementedException("ERROR!");
        Console.WriteLine("Method B executed");
    }
    static void ExecudeMethodInLoop(Action method, String methodName)
    {
        Boolean success = false;
        while(!success)
        {
            try
            {
                method.Invoke();
                success = true;
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Method {methodName} execution failed. Reason: {ex.Message}");
                Console.WriteLine($"Method {methodName} execution restart...");
            }
        }
    }
    static void Main(string[] args)
    {
        ExecudeMethodInLoop(MethodA, "A");
        ExecudeMethodInLoop(MethodB, "B");
    }
}
READ ALSO
Блокируется UI при использовании async-await C#

Блокируется UI при использовании async-await C#

Есть форма с button и LabelПри нажатии на кнопку выполняется метод button1_Click:

243
Возможен ли асинхронный сервер RabbitMQ?

Возможен ли асинхронный сервер RabbitMQ?

Рассмотрел шаблон работы RabbitMQ(RPC) принцип работы описан тутКак я понял единственная возможность как то распараллелить обработку запросов...

196
Экземпляр класса в свойстве класса php

Экземпляр класса в свойстве класса php

Только начал изучать ООП на phpПоявилась необходимость создать класс для работы с файлами и архивами

205
Как установить возможности htaccess?

Как установить возможности htaccess?

Есть phpini, есть htaccess

246