Многопоточность

MishaMoix

Имеется класс class MainMeneger: Form, в нем объявляются интерфейсы
public IMainForm view;
public IMessegeService messege;
public IMathC math;
Затем в конструкторе задается
        public MainMeneger(IMainForm view, IMessegeService messege, IMathC math)
        {
            this.view = view;
            this.messege = messege;
            this.math = math;
        }
в этом классе есть метод
flag = view.GetValueComboBox();
value = view.GetNumber;
int[] valueEnd = math.finalize(flag, value);
view.SetNumber(valueEnd);
по нажатии кнопки мы должны создать отдельный поток с этим методом и запустить его. BackGrounWorker не подойдет т.к. я хочу по нажатии другой кнопки завершить этот процесс
4 ответа

MishaMoix

А в чем вопрос, собственно? Последнее время на форуме тем по многопоточности - сколько угодно, разве нет ничего подходящего? Поиском искали?


MishaMoix

Пытался запихнуть ThreadStart start = new ThreadStart(startCalc); // так функция называется Ошибки: An object reference is required for the non-static field, method, or property 'P1.MainMeneger.startCalc()' C:\Users\Misha\Desktop\P1\lP1\MainMeneger.cs и такая ошибка A field initializer cannot reference the non-static field, method, or property P1.MainMeneger.startCalc()' C:\Users\Misha\Desktop\P1\P1\MainMeneger.cs Как я понимаю можно в поток только статичные методы засовывать. Что же делать в моем случае? PS те же ошибки, если запихиваю сразу без делегата


MishaMoix

Может так попробуете?
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;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.Click+=new EventHandler(button1_Click);
            
        }
        void button1_Click(object sender, EventArgs e)
        {
            Thread thr = new Thread(new ThreadStart(MyThread));
            thr.Start();
        }
 
        void  MyThread()
        {
            for (int i = 0; i <= 1000; i++)
            {
                Thread.Sleep(100);
                textBox1.Invoke(new Action(() => textBox1.Text = i.ToString()));
            } 
        }
    }
}


MishaMoix

по нажатии кнопки мы должны создать отдельный поток с этим методом и запустить его.
зачем? GetValueComboBox и SetNumber уж точно можно выполнять в основном потоке. для создания потока используйте Task.Factory.StarNew/Task.Run для отмены таска - CancellationToken. для локализации обработки результатов работы потока - async/await