Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 54
1

Реализовать выполнение метода в фоне до тех пор пока не нажата кнопка стоп

14.11.2016, 19:36. Просмотров 1519. Ответов 6
Метки нет (Все метки)


Здравствуйте)
Подскажите пожалуйста какой класс использовать для создания потока или может есть еще какой-то вариант.
Нужно чтобы метод выполнялся в фоне до тех пор пока не нажата кнопка стоп.
Вот этот метод:
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
private void Inspection()
        {
            JsonParsing.RootObject rootObject;
            List<AnsweredData> listAnsweredData;
 
            if (!stopThread)
            {
                rootObject = UrlData.GetJsonRootObject();
                listAnsweredData = ReadFile();
                bool contain = false;
 
                for (int i = 0; i < rootObject.result.Count; i++)
                {
                    for (int j = 0; j < listAnsweredData.Count; j++)
                    {
                        if (rootObject.result[i].update_id == listAnsweredData[j].update_id
                            && rootObject.result[i].message.message_id == listAnsweredData[j].message_id
                            && rootObject.result[i].message.chat.id == listAnsweredData[j].user_id)
                            contain = true;
                        if (rootObject.result[i].message.chat.id == listAnsweredData[j].update_id
                            && listAnsweredData[j].update_id == 000 && listAnsweredData[j].message_id == 000)
                            contain = true;
                    }
                    
                    if (!contain)
                    {
                        UrlData.SendMessage(rootObject.result[i].message.chat.id,
                            ResponseToTheUser.Answered(rootObject.result[i].message.text));
                        WriteInFile(rootObject.result[i].update_id,
                            rootObject.result[i].message.message_id,
                            rootObject.result[i].message.chat.id);
                        OutDataInTable(rootObject, i);
                        contain = false;
                    }
                    else contain = false;
                }
                Thread.Sleep(timeSleep);
            }
        }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.11.2016, 19:36
Ответы с готовыми решениями:

Выполнение цикла до тех пор, пока не будет нажата определенная клавиша
Доброе время суток, люди добрые! Начал заниматься С++ не так давно, поэтому всех хтростей не знаю,...

Как подключать клиентов, до тех пор пока не нажата определенная кнопка?
С помощью keyEvent. Допустим есть цикл вечный подключения клиентов while(true) { ...

Вводить строки до тех пор, пока не будет введено стоп-слово
Задача: вводить строки до тех пор, пока не стоп-слово. Моё минимально нерабочее решение: ...

Вводить с клавиатуры числа до тех пор, пока не будет нажата клавиша <<ESC>>
Задание: Вводить с клавиатуры числа до тех пор, пока не будет нажата клавиша &lt;&lt;ESC&gt;&gt;. На экран...

6
.NET senior
437 / 355 / 137
Регистрация: 23.09.2016
Сообщений: 980
14.11.2016, 21:36 2
Vex788, если версия .NET 4.5 и выше, то я бы сделал как-то так:

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
 
namespace CyberForum
{
    public class SomeEntryClass
    {
        private CancellationTokenSource TokenSource;
        private Task InspectionTask;
        
        public void EntryMethod()
        {
            TokenSource = new CancellationTokenSource();
            InspectionTask = Task.Run(new Action(Inspection), TokenSource.Token);
        }
        
        public void CancelMethod()
        {
            TokenSource.Cancel();
            InspectionTask.Wait();
        }
        
        private void Inspection()
        {
            CancellationToken token = TokenSource.Token;
            
            // some long cycle
            while (true)
            {
                if (token.IsCancellationRequested) break; // exit when canceled
                
                // some code
            }
            
            // some other code
        }
    }
}
0
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 54
14.11.2016, 22:23  [ТС] 3
bax_tang, Спасибо, работает) но через минуту когда не приходят новые данные процесс засыпает. Не знаете как можно решить эту проблему?
0
.NET senior
437 / 355 / 137
Регистрация: 23.09.2016
Сообщений: 980
14.11.2016, 22:32 4
Vex788, предполагаю, что код падает в Thread.Sleep, из которого долго не выходит из-за большого значения времени ожидания, либо из-за какого-то условия происходит уход в бесконечный цикл. Покажите код в его текущем состоянии - тогда разговор будет более предметным.
0
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 54
15.11.2016, 14:03  [ТС] 5
bax_tang,
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace JohnyBot
{
    public partial class AdminPanel : Form
    {
        public AdminPanel()
        {
            InitializeComponent();
        }
 
        private int timeSleep = 1000;
        private Task InspectionTask;
        private CancellationTokenSource tokenSource;
 
        public class AnsweredData
        {
            public int update_id;
            public int message_id;
            public int user_id;
        }
 
        public List<AnsweredData> listAnsweredData = new List<AnsweredData>();
 
        private List<AnsweredData> ReadFile()
        {
            string[] usersData = File.ReadAllLines("OfAnsweredMessagesInformation.txt");
            string[] data;
            AnsweredData answeredData;
 
            foreach (string s in usersData)
            {
                answeredData = new AnsweredData();
                data = s.Split(new char[] { ' ' });
                answeredData.update_id = Convert.ToInt32(data[0]);
                answeredData.message_id = Convert.ToInt32(data[1]);
                answeredData.user_id = Convert.ToInt32(data[2]);
                listAnsweredData.Add(answeredData);
            }
 
            return listAnsweredData;
        }
 
        private void WriteInFile(int update_id, int message_id, int user_id)
        {
            StreamWriter streamWriter = new StreamWriter("OfAnsweredMessagesInformation.txt", true);
            streamWriter.WriteLine(update_id + " " + message_id + " " + user_id);
            streamWriter.Close();
        }
 
        public void OutDataInTable(JsonParsing.RootObject rootObject, int index)
        {
            try
            {
                if (rootObject != null)
                {
                    userTable.Rows.Add(rootObject.result[index].message.chat.id,
                        rootObject.result[index].message.message_id,
                        rootObject.result[index].message.chat.first_name,
                        rootObject.result[index].message.chat.last_name,
                        rootObject.result[index].message.chat.username,
                        rootObject.result[index].message.date,
                        rootObject.result[index].message.text);
                }
            }
            catch (InvalidOperationException ex)
            {
                MessageBox.Show(ex.ToString(), "Invalid operation exception");
            }
        }
 
        private void Inspection()
        {
            JsonParsing.RootObject rootObject;
            List<AnsweredData> listAnsweredData;
            CancellationToken cancelToken = tokenSource.Token;
 
            while (true)
            {
                if (cancelToken.IsCancellationRequested) break;
 
                rootObject = UrlData.GetJsonRootObject();
                listAnsweredData = ReadFile();
                bool contain = false;
 
                for (int i = 0; i < rootObject.result.Count; i++)
                {
                    for (int j = 0; j < listAnsweredData.Count; j++)
                    {
                        if (rootObject.result[i].update_id == listAnsweredData[j].update_id
                            && rootObject.result[i].message.message_id == listAnsweredData[j].message_id
                            && rootObject.result[i].message.chat.id == listAnsweredData[j].user_id)
                            contain = true;
                        if (rootObject.result[i].message.chat.id == listAnsweredData[j].update_id
                            && listAnsweredData[j].update_id == 000 
                            && listAnsweredData[j].message_id == 000)
                            contain = true;
                    }
 
                    if (!contain)
                    {
                        UrlData.SendMessage(rootObject.result[i].message.chat.id,
                            ResponseToTheUser.Answered(rootObject.result[i].message.text));
                        WriteInFile(rootObject.result[i].update_id,
                            rootObject.result[i].message.message_id,
                            rootObject.result[i].message.chat.id);
                        OutDataInTable(rootObject, i);
                        contain = false;
                    }
                    else contain = false;
                }
                Thread.Sleep(timeSleep);
            }
        }
 
        private void launchButton_Click(object sender, EventArgs e)
        {
            tokenSource = new CancellationTokenSource();
            InspectionTask = Task.Run(new Action(Inspection), tokenSource.Token);
        }
 
        private void stopButton_Click(object sender, EventArgs e)
        {
            tokenSource.Cancel();
            InspectionTask.Wait();
        }
 
        private void timeThreadSleep_SelectedIndexChanged(object sender, EventArgs e)
        {
            timeSleep = Convert.ToInt32(timeThreadSleep.SelectedItem);
        }
    }
}
Добавлено через 12 минут
bax_tang, И еще когда в форме включить вкладку с таблицей то прога крашиться с ошибкой что функция которая выводит данные в таблицу работает в другом потоке но когда запускаю ее в потоке с функцией Inspection то все-равно крах.
0
Модератор
Эксперт .NET
5304 / 4100 / 1183
Регистрация: 12.10.2013
Сообщений: 11,909
Записей в блоге: 2
15.11.2016, 16:42 6
Лучший ответ Сообщение было отмечено Vex788 как решение

Решение

Цитата Сообщение от Vex788 Посмотреть сообщение
может есть еще какой-то вариант.
Вот самый простой.
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
 
namespace WindowsFormsApplication1 {
    public partial class Form1 : Form {
        InspectionWorker worker = null;
        int counter = 0;
 
        public Form1() {
            InitializeComponent();
            btnStart.Click += new EventHandler(btnStart_Click);
            btnStop.Click += new EventHandler(btnStop_Click);
            btnStop.Enabled = false;
        }
 
        void btnStop_Click(object sender, EventArgs e) {
            ResetButtons();
            if (worker != null && worker.IsBusy) {
                worker.CancelAsync();
                worker.Dispose();
            }
        }
 
        void btnStart_Click(object sender, EventArgs e) {
            ResetButtons();
            worker = new InspectionWorker();
            worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
            worker.RunWorkerAsync();
        }
 
        void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
            label1.Text = (counter = 0).ToString();
        }
 
        void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) {
            label1.Text = counter++.ToString();
        }
        void ResetButtons() {
            btnStart.Enabled = !btnStart.Enabled;
            btnStop.Enabled = !btnStop.Enabled;
        }
    }
 
    public class InspectionWorker : BackgroundWorker {
        public InspectionWorker() {
            this.WorkerReportsProgress = true;
            this.WorkerSupportsCancellation = true;
        }
 
        protected override void OnDoWork(DoWorkEventArgs e) {
            while (true) {
                if (this.CancellationPending) {
                    e.Cancel = true;
                    return;
                }
                //Do some work here...
                Thread.Sleep(100);
 
                //Here we can report about process progress...
                ReportProgress(0, null);
            }
        }
    }
}
1
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 54
16.11.2016, 13:57  [ТС] 7
insite2012, Спасибо) то что нужно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2016, 13:57

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Вывести коды сканирования клавиш до тех пор, пока не будет нажата клавиша Esc
Написать программу, которая читает и выводит коды сканирования клавишей до тех пор, пока не будет...

Выполнение функции пока нажата UI кнопка
Здравствуйте. Как сделать так, что бы функция к примеру перемежение, выполнялась всегда пока нажата...

Выполнение функции, пока не будет нажата любая кнопка
Собственно речь о !Kbhit() Думаю опытные люди знают что это за функция и что она делает, а...

Создать консольное приложение, которое продолжало бы работать до тех пор, пока не нажата клавиша "y"
Доброго времени суток. Прошу помочь в решении поставленного передо мной вопроса. Суть: Нужно...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.