Консольное приложение Threading - PullRequest
0 голосов
/ 16 марта 2020

У меня есть консольное приложение, которое запускает Excel и делает что-то внутри отлично. Теперь я хочу создать два потока, которые go проходят через эти рабочие состояния, когда они берут текст из одного Excel и помещают его в другой.

Итак, я написал этот код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;

namespace PrestaConverter
{
    class Program
    {           
        static void Main(string[] args)
        {
            Console.WriteLine("skriv in filvägen till Kategorifil");
            string path = Console.ReadLine();

            while(File.Exists(path) == false)
            {
                Console.WriteLine("fel filväg skriv in en ny");
                path = Console.ReadLine(); 
            }

            Thread workThreadOne = new Thread(ThreadWorker(path));
        }

        static void ThreadWorker(string path)
        {
            ExcelConverter convert = new ExcelConverter();
            convert.Convert(path);
        }
    }
}

Хотя, когда я пытаюсь создать новый поток, он говорит мне, что он не может конвертировать из void в system.threading.threadstart, и я не знаете, что я делаю не так? Мне нужны новые потоки, потому что у меня есть более чем одна вещь, которую нужно сделать, мне нужно многозадачность двумя методами и Threadpool, как я понимаю, просто задавать работу существующему потоку потоков

1 Ответ

0 голосов
/ 16 марта 2020

Это то, как вы используете задачу, учитывая ваш код. Однако обратите внимание, что этот код не может быть скомпилирован так, как вы его опубликовали, поскольку ExcelConverter не определено.

Тем не менее, он должен выглядеть так:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;

namespace PrestaConverter
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("skriv in filvägen till Kategorifil");
            string path = Console.ReadLine();

            while (File.Exists(path) == false)
            {
                Console.WriteLine("fel filväg skriv in en ny");
                path = Console.ReadLine();
            }

            Task worker = Task.Run(() => ThreadWorker(path));

            // Wait for task to complete.

            Console.WriteLine("Waiting for background task to complete.");

            worker.Wait();

            Console.WriteLine("Background task has completed");
            Console.ReadLine();
        }

        static void ThreadWorker(string path)
        {
            ExcelConverter convert = new ExcelConverter();
            convert.Convert(path);
        }
    }
}

Если задача возвращает результат, вы просто создаете его как Task<T>.Run(() => ...)), где T - тип результата. Затем вместо ожидания завершения задачи, используя .Wait(), вы можете получить доступ к Task.Result для получения результата - это заставит его ждать завершения задачи, прежде чем получить доступ к результату.

Вот пример изменено выше, так что ThreadWorker() возвращает строку:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;

namespace PrestaConverter
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("skriv in filvägen till Kategorifil");
            string path = Console.ReadLine();

            while (File.Exists(path) == false)
            {
                Console.WriteLine("fel filväg skriv in en ny");
                path = Console.ReadLine();
            }

            Task<string> worker = Task.Run(() => ThreadWorker(path));

            // Wait for task to complete.

            Console.WriteLine("Waiting for background task to complete.");

            string result = worker.Result;

            Console.WriteLine("Background task returned: " + result);

            Console.WriteLine("Background task has completed");
            Console.ReadLine();
        }

        static string ThreadWorker(string path)
        {
            ExcelConverter convert = new ExcelConverter();
            convert.Convert(path);

            return "This is the result";
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...