Заправить нить подавить до нажатия кнопки - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть приложение, которое я создаю, которое использует MVVM, и мне нужно разделить работу на несколько потоков, и я понятия не имею, как и почему это не работает, что я делаю. Мне нужно, чтобы пользовательский интерфейс оставался отзывчивым, но я хочу деактивировать кнопку, как только я ее нажму. мой код выглядит так В результате я получаю возврат от categoryconverter, и кнопка возвращается в isAvailable, а поток приостанавливается до следующего нажатия кнопки? но сейчас я не могу заставить его работать только в поточной части.

MainWindowViewModel:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Input;
using DataConverter.Checkers;
using DataConverter.Converters;
using DataConverter.Command;
using DataConverter.Objects;
using DataConverter.Threads; 

namespace DataConverter.ViewModels
{
    public class MainWindowViewModel : BaseViewModel
    {
       public List<Category> categories = new List<Category>();
       public string path { get; set; }

       public bool runButtonWorks { get; set; }
       public string errorMessage { get; set; }
       public ICommand run { get; set; }
       public MainWindowViewModel()
       {
            runButtonWorks = true;

            ThreadOne th = new ThreadOne(); 

            Thread t1 = new Thread(new ThreadStart(th.startProgram(path)));

            run = new RelayCommand(t1.Start);
       }
    }
}

ThreadOne:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DataConverter.Checkers;
using DataConverter.Converters;

namespace DataConverter.Threads
{
    class ThreadOne
    {
        public void startProgram(string path)
        {

        }


        private bool CategoryWorker(string path)
        {
            FileCheck checkFile = new FileCheck();
            CategoryConverter categoryConverter = new CategoryConverter();

            if (checkFile.checkFile(path))
            {
                runButtonWorks = false;
                categoryConverter.getCategoryList(path);
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}

1 Ответ

1 голос
/ 15 апреля 2020

Эта строка:

Thread t1 = new Thread(new ThreadStart(th.startProgram(path)));

Создает поток с startProgram(...) в качестве точки входа. Как только вы запускаете поток, код в этом методе выполняется в созданном потоке. И поскольку этот метод пуст, он вообще ничего не делает.

Затем возникает проблема уведомления потока пользовательского интерфейса о том, что рабочий поток завершен, и принятия его возвращаемого значения. Есть разные способы сделать это sh, в зависимости от платформы пользовательского интерфейса, с которой вы работаете.

На вашем месте я бы взглянул на System.Threading.Tasks, который имеет более чистый API, особенно если вы хотите получить возвращаемое значение из вашего потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...