Как мне лучше написать свой собственный фоновый рабочий и общительный (отправка обновлений и получение сообщений) невизуальный класс в C # 4? - PullRequest
1 голос
/ 30 апреля 2010

Мне нужно разработать класс, который может запускать свои собственные жестко заданные задачи в фоновом потоке и взаимодействовать с классом контейнера, посылая ему обновления прогресса и получая от него сообщения. Я думаю, что собираюсь расширить класс BackgroundWorker, но это выглядит немного странно, и мне не удалось найти хороший пример с Google. Можете поделиться ссылкой на хороший пример решения такой задачи? Пожалуйста, не предлагайте размещать BackgroundWorker визуально в форме и читать стандартное руководство, это не для меня. Возможно, мне лучше не расширять, а инкапсулировать BackgroundWorker, но я не понимаю, как его использовать, кроме дизайнера WinForms: - (

Ответы [ 3 ]

2 голосов
/ 30 апреля 2010

BackgroundWorker не даст вам никаких препятствий для внедрения обновлений прогресса, ReportProgress () поможет вам выполнить эту работу. «Отправка сообщений» - другой вопрос.

Вам понадобится потокобезопасная очередь, в которую можно добавлять объекты, представляющие единицу работы. Опорожняется BGW в своем основном цикле в обработчике событий DoWork. .NET 4.0, безусловно, помогает вам в этом, ConcurrentQueue возвращает вас в очередь.

1 голос
/ 30 апреля 2010

Вы можете сделать это в качестве службы Windows: http://www.c -sharpcorner.com / uploadfile / mahesh / window_service11262005045007am / window_service.aspx

0 голосов
/ 01 мая 2010

Я бы сделал это с помощью процедуры обратного вызова, которая сообщает о состоянии дочернего потока и возвращает значение из родительского потока. В следующем примере консольного приложения я передаю строку и возвращаю bool, но аргументы могут быть любыми.

public delegate bool CallbackDelegate(string messageArg);

class Program
{
    static bool running = true;

    static void Main(string[] args)
    {
        for (int i = 0; i < 10; i++)
        {
            Worker worker = new Worker();
            worker.Callback = new CallbackDelegate(WorkerStatus);

            Thread thread = new Thread(new ThreadStart(worker.DoSomething));
            thread.IsBackground = true;
            thread.Start();
        }
        Console.ReadKey(); 
        running = false;
        Console.ReadKey();
    }

    static bool WorkerStatus(string statusArg)
    {
        Console.WriteLine(statusArg);
        return running;
    }
}

public class Worker
{
    public CallbackDelegate Callback { private get; set; }

    public void DoSomething()
    {
        bool keepGoing = true;
        while (keepGoing)
        {
            keepGoing = Callback("Thread ID: " + Thread.CurrentThread.ManagedThreadId.ToString() + " running");
            Thread.Sleep(new Random().Next(100, 2000));
        }
        Callback("Thread ID: " + Thread.CurrentThread.ManagedThreadId.ToString() + " done");
    }
}
...