Потоки, эвенты, делегаты. Преобразовать код так, чтобы функция вызывалась в отдельном потоке - C#
Формулировка задачи:
доброго времени суток.
изначально была функция, которая выглядит примерно вот так:
необходимо преобразовать данный код так, чтобы эта функция вызывалась в отдельном потоке. т.к. у подобных функций есть ограничение, мол, в потоке могут вызываться функции только типа void, то сказали использовать event и delegate.
т.е. начало должно быть такое:
не могу понять, что делать дальше. особенно интересует вопрос, как именно возвращать требуемый список.
public MyModel[] ReturnList( int id )
{
MyModel [] ReturnModel = new MyModel[0];
try
{
ReturnModel = GetList(id);
}
catch
{
ReturnModel = null;
}
return ReturnModel;
}public int _id = new int();
public void ReturnList( int id )
{
_id = id;
Thread TR = new Thread(Tr_ReturnList);
TR.Start();
}
public delegate void MyDelegate ( MyModel []data );
public event MyDelegate MyEvent;
public void Tr_ReturnList()
{
MyModel [] ReturnModel = new MyModel[0];
try
{
ReturnModel = GetList(id);
}
catch
{
ReturnModel = null;
}
}Решение задачи: «Потоки, эвенты, делегаты. Преобразовать код так, чтобы функция вызывалась в отдельном потоке»
textual
Листинг программы
using System;
using System.Threading;
namespace ConsoleApplication1
{
public delegate T GetDataHandler<T>(int id);
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 4; i++)
{
LoadData(i);
}
Console.ReadKey();
}
public static void LoadData(int id)
{
GetDataHandler<Something[]> handler = Database.GetData;
handler.BeginInvoke(id,
asyncResult =>
{
Something[] data = handler.EndInvoke(asyncResult);
Display(data);
}, null);
}
public static void Display(Something[] data)
{
foreach (Something something in data)
{
Console.WriteLine(something.Name);
}
}
}
public class Something
{
public Something(string name)
{
Name = name;
}
public string Name { get; set; }
}
public class Database
{
private static readonly Random _random = new Random();
private static readonly object _randomSync = new object();
public static Something[] GetData(int id)
{
Thread.Sleep(GetRandomValue());
switch (id)
{
case 0:
return new Something[]
{
new Something("1"),
new Something("2"),
new Something("3")
};
case 1:
return new Something[]
{
new Something("4"),
new Something("5"),
new Something("6")
};
case 2:
return new Something[]
{
new Something("7"),
new Something("8"),
new Something("9")
};
case 3:
return new Something[]
{
new Something("10"),
new Something("11"),
new Something("12")
};
default:
return null;
}
}
private static int GetRandomValue()
{
lock (_randomSync)
return _random.Next(100, 400);
}
}
}