Потоки, эвенты, делегаты. Преобразовать код так, чтобы функция вызывалась в отдельном потоке - 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); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д