Многопоточность - передача аргументов и получение результатов - PullRequest
0 голосов
/ 17 ноября 2018

Я пробую различные варианты работы с потоками.Я написал код ниже, но он не работает, как ожидалось.Как можно исправить код, чтобы основная функция правильно отображала продукт?

using System;
using System.Threading;

namespace MultiThreads
{
    class Program
    {
        static int prod;
        public static void Main(string[] args)
        {
            Thread thread = new Thread(() => Multiply(2, 3));
            thread.Start();         
            for(int i = 0; i < 10; i++) { // do some other work until thread completes
                Console.Write(i + " ");
                Thread.Sleep(100);
            }
            Console.WriteLine();

            Console.WriteLine("Prod = " + prod); // I expect 6 and it shows 0
            Console.ReadKey(true);
        }

        public static void Multiply(int a, int b)
        {
            Thread.Sleep(2000);
            prod = a * b;
        }
    }
}

1 Ответ

0 голосов
/ 17 ноября 2018

Игнорирование того факта, что вы должны использовать неблокирующие задачи, изменяемые свойства и другие сопрограммные принципы, непосредственной причиной того, что ваша программа не работает должным образом, заключается в том, что вы не повторно включили дочерний поток обратно в родительский.См. Присоединение

Без объединения Console.WriteLine ("Prod =" + prod);происходит до назначения prod = a * b;

static int prod;
static void Main(string[] args)
{
    Thread thread = new Thread(() => Multiply(2, 3));
    thread.Start();
    for (int i = 0; i < 10; i++)
    { // do some other work until thread completes
        Console.Write(i + " ");
       Thread.Sleep(100);
    }
    thread.Join(); // Halt current thread until the other one finishes.
    Console.WriteLine();

    Console.WriteLine("Prod = " + prod); // I expect 6 and it shows 0
    Console.ReadKey(true);
}

public static void Multiply(int a, int b)
{
    Thread.Sleep(2000);
    prod = a * b;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...