Потоки, эвенты, делегаты. Преобразовать код так, чтобы функция вызывалась в отдельном потоке - C#

Узнай цену своей работы

Формулировка задачи:

доброго времени суток. изначально была функция, которая выглядит примерно вот так:
public MyModel[] ReturnList( int id )
{
        MyModel [] ReturnModel = new MyModel[0];
        
        try
        {
               ReturnModel = GetList(id);
        }
        catch
        {
               ReturnModel = null;
        }
  
         return ReturnModel;
}
необходимо преобразовать данный код так, чтобы эта функция вызывалась в отдельном потоке. т.к. у подобных функций есть ограничение, мол, в потоке могут вызываться функции только типа void, то сказали использовать event и delegate. т.е. начало должно быть такое:
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);
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5
Похожие ответы