выполнить метод C # асинхронно с использованием Threading в службе Windows - PullRequest
0 голосов
/ 26 января 2012

У меня есть служба Windows, которая запускается каждые 10 секунд для выполнения метода чтения. Метод Read подключается к удаленному серверу по URL-адресу соединения, указанному в конструкторе. если удаленный сервер не отвечает, он выдает ошибку и отправляется на перехват. Как заставить поток начать снова?

class PMTicketsService
{
    private Timer _serviceTimer;
    private TimerCallback _timerDelegate;

    public PMTicketsService()
    {   
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        // Set the method to execute when the timer executes.
        _timerDelegate = new TimerCallback(Receive);

        // Create timer and attach our method delegate to it
        _serviceTimer = new Timer(_timerDelegate, null, 1000, 10000);
    }

    public void Receive(object state)
    {
        ABC abc = new ABC(Url);
        ABC abc1 = new ABC(Url1);

        /* Create the thread object, passing in the abc.Read() method
        via a ThreadStart delegate. This does not start the thread. */
        Thread oThread = new Thread(new ThreadStart(abc.Read());
        Thread oThread1 = new Thread(new ThreadStart(abc1.Read());

        // Start the thread
        oThread.Start();
        oThread1.Start();

        oThread.Join();
        oThread1.Join();
    }
}

class ABC
{
    public string strUrl;

    public ABC(string url)
    {
        strUrl = url;
    }

    public void Read()
    {
        try
        {
            // Code to use the connectionurl to access a remote server
        }
        catch (Exception ex)
        {
            // If the connection url fails to respond, how do we make thread start again?
        }
    }
}

Ответы [ 2 ]

1 голос
/ 26 января 2012

В будущем вы должны предоставить пример кода, который на самом деле компилируется. Я взял то, что у тебя было, почистил, удалил ненужный таймер и структурировал его так, чтобы он дал тебе то, что тебе нужно. В приведенном ниже коде ваш метод чтения будет продолжать работать, пока вы не установите done на true.

    protected override void OnStart(string[] args)
    {
        try
        {
            ABC abc = new ABC("www.abc.com");

            // Create the thread object, passing in the abc.Read() method
            Thread oThread = new Thread(new ThreadStart(abc.Read));

            // Start the thread
            oThread.Start();
        }
        catch (Exception)
        {

        }
    }

    public class ABC
    {
        string strUrl = "";

        public ABC(string url)
        {
            strUrl = url;
        }

        public void Read()
        {
            bool done = false;

            while (!done)
            {
                try
                {
                    //Code to use the connectionurl to access a remote server
                    //Use strUrl in here
                }
                catch (Exception)
                {
                    //Wait 10 seconds before trying again
                    Thread.Sleep(10000);
                }

                //On success, set done to true
                done = true;
            }
        }
    }
1 голос
/ 26 января 2012

Почему вы хотите начать другую тему?Запуск / остановка потоков - это дорогостоящая операция, вам гораздо лучше просто держать существующий поток открытым и постоянно пытаться соединиться (возможно, в режиме ожидания).У вас уже есть попытка / ловить, чтобы предотвратить сбой потока.Просто оберните try / catch через некоторое время (! Done) и сделайте true готовым после успешного подключения.

Возможно, вы также захотите добавить некоторый код, чтобы, если вы не можете подключиться X раз встрока (может быть 5?), тогда вы перестанете пытаться или увеличите время ожидания между попытками подключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...