Потоки с параметрами - C#
Формулировка задачи:
Добрый вечер!
Пытаюсь работать с потоками,которые имеют функцию с 5-ю парамерами.
Программу сделал,но при работе она вылетает с ошибкой "Индекс находился вне границ массива".
Но при попытке пошаговой отладки клавишей F11 всё работает.
Но массив в любом случае заполняется не полностью. В чём ошибка,и как исправить? И можно ли вернуть результат функции из какого либо потока?(если функцию изменить)
код:
Тема не сильно важная,но возможно пригодится мне в будущем.
using System;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int number = 1;
Console.WriteLine("Во сколько потоков заполнять?");
number=Convert.ToInt32(Console.ReadLine());
int[,] massiv = new int[101, 101];
int chislo = 100 / number; //определяем диапазон заполнения для одного потока
int last=0,next=chislo; //переменные для начального индекса и конечного индекса заполнения массива
Thread[] threads = new Thread[number];
for (int e = 0; e < threads.Length; e++)
{
threads[e] = new Thread(delegate() { vvodmas(last, last, next, next, massiv); }); //нашёл на форумах-передача функции с параметрами в поток
threads[e].Start(); //запуск потока
last = next; //началом становится последний индекс массива,который будет обрабатывать предыдущий поток
next += chislo; //конец-текущий элемент+размерность
}
for (int i = 0; i < massiv.GetLength(0);i++ )
{
for (int j = 0; j < massiv.GetLength(1);j++ )
{
Console.WriteLine("Элемент {0}", massiv[i, j]); //вывод массива
}
}
}
static void vvodmas(int q, int w, int a, int s, int[,] m)
{
Random rnd = new Random();
for (int i = q; i < a; i++)
{
for (int j = w; j < s; j++)
{
m[i, j] = rnd.Next(0, 100); //заполнение диапазона случайными числами
}
}
}
}
}Решение задачи: «Потоки с параметрами»
textual
Листинг программы
class Program
{
private static event Action someEvenet;
private static void Main(string[] args)
{
Console.Write("Main thread: ");
PrintCurrentThread();
someEvenet += () =>
{
Console.Write("Event thread: ");
PrintCurrentThread();
};
Thread thread = new Thread(() => someEvenet());
thread.Start();
Thread.Sleep(10000);
}
private static void PrintCurrentThread()
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
}
}