Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
7 / 7 / 3
Регистрация: 15.01.2014
Сообщений: 459
1

Одновременное выполнение оператора if

10.03.2015, 20:33. Показов 2405. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, господа. Есть код:

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
92
93
94
95
96
97
98
99
       if (AreAllAvailable("login.p1.worldoftanks.net"))
                    {
                        label10.ForeColor = System.Drawing.Color.Green;
                        label10.Text = "Сервер доступен";
                    }
                    else
                    {
                        label10.ForeColor = System.Drawing.Color.Red;
                        label10.Text = "Сервер недоступен";
                    }
                    //ru2
                    if (AreAllAvailable("login.p2.worldoftanks.net"))
                    {
                        label11.ForeColor = System.Drawing.Color.Green;
                        label11.Text = "Сервер доступен";
                    }
                    else
                    {
                        label11.ForeColor = System.Drawing.Color.Red;
                        label11.Text = "Сервер недоступен";
                    }
                    //ru3
                    if (AreAllAvailable("login.p3.worldoftanks.net"))
                    {
                        label12.ForeColor = System.Drawing.Color.Green;
                        label12.Text = "Сервер доступен";
                    }
                    else
                    {
                        label12.ForeColor = System.Drawing.Color.Red;
                        label12.Text = "Сервер недоступен";
                        label30.Text = "-";
                    }
                    //ru4
                    if (AreAllAvailable("login.p4.worldoftanks.net"))
                    {
                        label13.ForeColor = System.Drawing.Color.Green;
                        label13.Text = "Сервер доступен";
                    }
                    else
                    {
                        label13.ForeColor = System.Drawing.Color.Red;
                        label13.Text = "Сервер недоступен";
                    }
                    //ru5
                    if (AreAllAvailable("login.p5.worldoftanks.net"))
                    {
                        label14.ForeColor = System.Drawing.Color.Green;
                        label14.Text = "Сервер доступен";
                    }
                    else
                    {
                        label14.ForeColor = System.Drawing.Color.Red;
                        label14.Text = "Сервер недоступен";
                    }
                    //ru6
                    if (AreAllAvailable("login.p6.worldoftanks.net"))
                    {
                        label15.ForeColor = System.Drawing.Color.Green;
                        label15.Text = "Сервер доступен";
                    }
                    else
                    {
                        label15.ForeColor = System.Drawing.Color.Red;
                        label15.Text = "Сервер недоступен";
                    }
                    //ru7
                    if (AreAllAvailable("login.p7.worldoftanks.net"))
                    {
                        label16.ForeColor = System.Drawing.Color.Green;
                        label16.Text = "Сервер доступен";
                    }
                    else
                    {
                        label16.ForeColor = System.Drawing.Color.Red;
                        label16.Text = "Сервер недоступен";
                    }
                    //ru8
                    if (AreAllAvailable("login.p8.worldoftanks.net"))
                    {
                        label17.ForeColor = System.Drawing.Color.Green;
                        label17.Text = "Сервер доступен";
                    }
                    else
                    {
                        label17.ForeColor = System.Drawing.Color.Red;
                        label17.Text = "Сервер недоступен";
                    }
                    //ru9
                    if (AreAllAvailable("login.p9.worldoftanks.net"))
                    {
                        label18.ForeColor = System.Drawing.Color.Green;
                        label18.Text = "Сервер доступен";
                    }
                    else
                    {
                        label18.ForeColor = System.Drawing.Color.Red;
                        label18.Text = "Сервер недоступен";
                    }
Видим несколько операторов условия подряд. Суть в чём - последний if будет ждать, пока не выполнится первый. То есть, условия выполняются один за одним, поочерёдно. А как сделать так, что бы условия выполнялись одновременно?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2015, 20:33
Ответы с готовыми решениями:

Одновременное выполнение
Здравствуйте, скажите пожалуйста как можно одновременно выполнить две операции Например, вот ...

Как сделать одновременное выполнение методов/циклов?
Как сделать одновременное выполнение нескольких методов/циклов одновременно, и как сделать, чтобы...

Одновременное выполнение всех циклов
Доброго времени суток! Имеется цикл, который определенное количесво раз выполняет одни и теже...

Возможно ли: выполнение подпрограммы в отдельном процессе, одновременное выполнение двух подпрограмм?
Всех приветствую :handshake: Пример @echo off call :PROG1 call :PROG2 exit /b :PROG1

16
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
10.03.2015, 20:40 2
Цитата Сообщение от OpenGoodwin Посмотреть сообщение
как сделать так, что бы условия выполнялись одновременно?
А зачем вам тогда тут оператор if()?
Заведите переменную (например, какое-нибудь enum), и по ней ориентируйтесь.
0
7 / 7 / 3
Регистрация: 15.01.2014
Сообщений: 459
10.03.2015, 20:41  [ТС] 3
insite2012, а чем можно его заменить?
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
10.03.2015, 20:42 4
Цитата Сообщение от OpenGoodwin Посмотреть сообщение
чем можно его заменить?
switch()
0
7 / 7 / 3
Регистрация: 15.01.2014
Сообщений: 459
10.03.2015, 20:45  [ТС] 5
insite2012, хм.. Никогда ранее не работал со switch. Продемонстрируете на примере? Буду премного благодарен
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
10.03.2015, 20:49 6
Цитата Сообщение от OpenGoodwin Посмотреть сообщение
Суть в чём - последний if будет ждать, пока не выполнится первый. То есть, условия выполняются один за одним, поочерёдно. А как сделать так, что бы условия выполнялись одновременно?
ужель это разные сервера, то разбить задачу на потоки, и пускай каждый поток общается со своим сервером
0
7 / 7 / 3
Регистрация: 15.01.2014
Сообщений: 459
10.03.2015, 21:20  [ТС] 7
Поможет кто?
0
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
10.03.2015, 21:35 8
Цитата Сообщение от OpenGoodwin Посмотреть сообщение
Поможет кто?
Так помогли же уже. switch один из самых базовых операторов, примеров миллион везде где можно.
switch
А если вам надо реально одновременное обработать, то гуглите потоки/параллельные вычисления итп.
0
Администратор
Эксперт .NET
17027 / 13379 / 5218
Регистрация: 17.03.2014
Сообщений: 27,360
Записей в блоге: 1
10.03.2015, 21:37 9
Лучший ответ Сообщение было отмечено OpenGoodwin как решение

Решение

OpenGoodwin, начать следует с рефакторинга кода в более удобочитаемый вид. Объявляем private class для адреса сервера и соответствующей ему метки:
C#
1
2
3
4
5
6
7
8
class ServerAndLabel {
    public string Server;
    public Label StatusLabel;
    public ServerAndLabel(string server, Label label) {
        Server = server;
        StatusLabel = label;
    }
}
Затем переписываем код опроса:
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
var servers = new[] {
    new ServerAndLabel("login.p1.worldoftanks.net", label10),
    new ServerAndLabel("login.p2.worldoftanks.net", label11),
    new ServerAndLabel("login.p3.worldoftanks.net", label12),
    new ServerAndLabel("login.p4.worldoftanks.net", label13),
    new ServerAndLabel("login.p5.worldoftanks.net", label14),
    new ServerAndLabel("login.p6.worldoftanks.net", label15),
    new ServerAndLabel("login.p7.worldoftanks.net", label16),
    new ServerAndLabel("login.p8.worldoftanks.net", label17),
    new ServerAndLabel("login.p9.worldoftanks.net", label18),
};
 
for (int i=0; i<servers.Length; i++)
{
    string server = servers[i].Server;
    Label label = servers[i].StatusLabel;
    if (AreAllAvailable(server))
    {
        label.ForeColor = Color.Green;
        label.Text = "Сервер доступен";
    }
    else
    {
        label.ForeColor = Color.Red;
        label.Text = "Сервер недоступен";
    }
}
Вместо 99 строк стало ~40. Код можно окинуть одним взглядом. Четко видно соответствие между сервером и меткой. При необходимости список легко изменить.

Шаг второй - потоки. Я не знаю какая у тебя версия .NET поэтому использую старый добрый ThreadPool.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var servers = new[] {
    new ServerAndLabel("login.p1.worldoftanks.net", label10),
    new ServerAndLabel("login.p2.worldoftanks.net", label11),
    new ServerAndLabel("login.p3.worldoftanks.net", label12),
    new ServerAndLabel("login.p4.worldoftanks.net", label13),
    new ServerAndLabel("login.p5.worldoftanks.net", label14),
    new ServerAndLabel("login.p6.worldoftanks.net", label15),
    new ServerAndLabel("login.p7.worldoftanks.net", label16),
    new ServerAndLabel("login.p8.worldoftanks.net", label17),
    new ServerAndLabel("login.p9.worldoftanks.net", label18),
};
 
for (int i=0; i<servers.Length; i++)
{
    ThreadPool.QueueUserWorkItem(UpdateServerStatus, servers[i]);
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void UpdateServerStatus(object state)
{
    ServerAndLabel sl = (ServerAndLabel)state;
    string server = sl.Server;
    Label label = sl.StatusLabel;
    if (AreAllAvailable(server))
    {
        label.Invoke((Action)(() => {
            label.ForeColor = Color.Green;
            label.Text = "Сервер доступен";
        } ));
    }
    else
    {
        label.Invoke((Action)(() => {
            label.ForeColor = Color.Red;
            label.Text = "Сервер недоступен";
        } ));
    }
}
1
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
10.03.2015, 21:44 10
Вот мой вариант (хотя нет, это видоизмененный из статьи ). Можете приспособить его под свои цели)))
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Net.NetworkInformation;
using System.Threading.Tasks;
 
namespace ConsoleApplication2 {
    class Program {
        static void Main(string[] args) {
            string[] addresses = { "www.yandex.ru", "www.mail.ru", "www.google.com" };
            var res = from ad in addresses
                      .AsParallel().WithDegreeOfParallelism(Environment.ProcessorCount)
                      let p = new Ping().Send(ad)
                      select new {
                          ADDR=ad,
                          RESULT=p.Status,
                          TIME=p.RoundtripTime
                      };
            foreach (var r in res) {
                Console.WriteLine("Address: {0}\nResult: {1}\nTime: {2}",
                    r.ADDR, r.RESULT, r.TIME);
                Console.WriteLine();
            }
            Console.ReadLine();
        }
    }
}
0
7 / 7 / 3
Регистрация: 15.01.2014
Сообщений: 459
10.03.2015, 21:53  [ТС] 11
OwenGlendower, вставляю этот код - 36 ошибок. Что-то со скобками не так?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void UpdateServerStatus(object state)
                    {
                        ServerAndLabel sl = (ServerAndLabel)state;
                        string server = sl.Server;
                        Label label = sl.StatusLabel;
                        if (AreAllAvailable(server))
                        {
                            label.Invoke((Action)(() => {
                                label.ForeColor = Color.Green;
                                label.Text = "Сервер доступен";
                            } ));
                        }
                        else
                        {
                            label.Invoke((Action)(() => {
                                label.ForeColor = Color.Red;
                                label.Text = "Сервер недоступен";
                            } ));
                        }
                    }
0
Администратор
Эксперт .NET
17027 / 13379 / 5218
Регистрация: 17.03.2014
Сообщений: 27,360
Записей в блоге: 1
10.03.2015, 21:56 12
Цитата Сообщение от OpenGoodwin Посмотреть сообщение
вставляю этот код - 36 ошибок. Что-то со скобками не так?
Синтаксических ошибок в коде точно нет. Какая у тебя версия Visual Studio? И под какую версию .NET ты разрабатываешь?
0
7 / 7 / 3
Регистрация: 15.01.2014
Сообщений: 459
10.03.2015, 22:00  [ТС] 13
OwenGlendower, студия 2013, .NET у меня стоит 4.5.1, разрабатываю под 4.5.
0
Администратор
Эксперт .NET
17027 / 13379 / 5218
Регистрация: 17.03.2014
Сообщений: 27,360
Записей в блоге: 1
10.03.2015, 22:09 14
OpenGoodwin, возможно ты пытаешься вставить метод внутрь другого метода или за пределами класса что запрещено правилами C#. Если нет, то выкладывай весь код и список ошибок компиляции.
0
7 / 7 / 3
Регистрация: 15.01.2014
Сообщений: 459
10.03.2015, 22:15  [ТС] 15
OwenGlendower, да, точно. Как дурень вставил void внутрь другого void. Теперь другая проблема. При компиляции - приложенный файл 1, при попытке открыть визуальный редактор формы - приложенный файл 2.
Миниатюры
Одновременное выполнение оператора if   Одновременное выполнение оператора if  
0
Администратор
Эксперт .NET
17027 / 13379 / 5218
Регистрация: 17.03.2014
Сообщений: 27,360
Записей в блоге: 1
10.03.2015, 22:23 16
OpenGoodwin, ответ на вопрос в сообщении об ошибке на втором скриншоте:
The class Form1 can be designed, but is not the first class in the file. Visual Studio requires that designers use the first class in the file.
Ты очевидно вставил класс ServerAndLabel перед классом Form1 чего делать не следует. В данном случае его можно вставить внутрь класса Form1 т.к. он нужен только ему. При необходимости можно будет сделать его отдельным классом.
0
7 / 7 / 3
Регистрация: 15.01.2014
Сообщений: 459
10.03.2015, 22:31  [ТС] 17
OwenGlendower, огромнейшее спасибо. Реализовал всё, что хотел. Успехов Вам

P.S. - код пометил, как лучший ответ.
0
10.03.2015, 22:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.03.2015, 22:31
Помогаю со студенческими работами здесь

Одновременное выполнение
работаю с monkeyrunner.bat , он запускает python Скрипты на андройде. Monkeyrunner...

Одновременное выполнение 3 действий
Мне нужно одновременное выполнение 3 действий: Проигрывание гиф Вывод динамического текста в...

Одновременное выполнение потоков
Выполняются по очереди и только после второго нажатия на кнопку происходит сортировка из-за этого...

Одновременное выполнение команд
Подскажите можно ли в Delphi и если можно то как реалиовать одновремменое выполнение. Допустим на...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru