Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > метод в отдельном потоке


Автор: golfV 3.2.2010, 15:34
Доброго времени суток!

возникла такая проблема!
есть метод
Код

  public  static  string FindFirst(SerialPort port, string first)
        {

            try
            {
gt:;
                string temp = "";
                initPort(port);
                byte[] toSend1 = new byte[] { 0x1B, 0x50, 0x0D, 0x0A };
                PortWrite(port, toSend1);
                temp = port.ReadLine();
                temp = parse(temp);
                if (Convert.ToDouble(temp) > 2.0)
                {
                    first = temp;
                }
                else
                {
                    goto gt;
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(Convert.ToString(ex));
            }
            return first;
}

как сделать чтоб когда его вызываю то он начинал работать в отдельном потоке? Если кто знает подскажите пожалуйста!

Автор: mrbrooks 3.2.2010, 15:39
Цитата(golfV @  3.2.2010,  15:34 Найти цитируемый пост)
Если кто знает подскажите пожалуйста!

используйте либо класс Thread, либо BackgroundWorker (если приложение с ГУЕМ - рекомендую его). Воспользуйтесь поиском по форуму - решения уже были.  smile 

Автор: uranpro 3.2.2010, 15:41
можно так
Код

Thread thr = new Thread(gelegat() {
gt:;
string temp = "";
                initPort(port);
                byte[] toSend1 = new byte[] { 0x1B, 0x50, 0x0D, 0x0A };
                PortWrite(port, toSend1);
                temp = port.ReadLine();
                temp = parse(temp);
                if (Convert.ToDouble(temp) > 2.0)
                {
                    first = temp;
                }
else
goto gt;
});
thr.IsBackground = true;
thr.Start();

или сделать так
Код

 public  static  string FindFirst(object state)
{
try
{
var o = (MyObject)state;
var port = o.port;
var first = o.first;

gt:;
                string temp = "";
                initPort(port);
                byte[] toSend1 = new byte[] { 0x1B, 0x50, 0x0D, 0x0A };
                PortWrite(port, toSend1);
                temp = port.ReadLine();
                temp = parse(temp);
                if (Convert.ToDouble(temp) > 2.0)
                {
                    first = temp;
                }
                else
                {
                    //Thread.Sleep(1000);
                    goto gt;
                }

}
catch {}
}

Автор: Ronin08 3.2.2010, 15:41
Код

using System;
using System.Threading;

public class Test
{
    static void Main()
    {
        ThreadStart job = new ThreadStart(FindFirst);
        Thread thread = new Thread(job);
        thread.Start();
        
       
    }

    public  static  string FindFirst(SerialPort port, string first)
        {
         ...........
        }
    
}


Автор: uranpro 3.2.2010, 15:42
вызов
Код

var thr = new Thread(FindFirst);
thr.IsBackground = true;
thr.Start(state);

Автор: golfV 3.2.2010, 16:03
uranpro попробовал сделать как ты сказал, что то неполучается, компилятро ругается.
Код

  public static string findf(SerialPort port, string first)
        {

            Thread thr = new Thread(delegate() {
           gt:;
                string temp = "";
                initPort(port);
                byte[] toSend1 = new byte[] { 0x1B, 0x50, 0x0D, 0x0A };
                PortWrite(port, toSend1);
                temp = port.ReadLine();
                temp = parse(temp);
                if (Convert.ToDouble(temp) > 2.0)
                {
                    first = temp;
                }
                else
                goto gt;
                });
                thr.IsBackground = true;
                thr.Start();
 
        }

с потоками первый раз сталкнулся, может я что то нетак делаю?

Добавлено @ 16:13
вроде все заработало! большое всем спасибо за помощь

Автор: golfV 3.2.2010, 16:33
у меня еще такой вопрос появился может кто с этим сталкивался
метод теперь выглядит таким образом
Код

 public static string FindFirst(SerialPort port, string first)
        {

            Thread thr = new Thread(delegate()
            {
           gt:;
                string temp = "";
                initPort(port);
                byte[] toSend1 = new byte[] { 0x1B, 0x50, 0x0D, 0x0A };
                PortWrite(port, toSend1);
                temp = port.ReadLine();
                temp = parse(temp);
                if (Convert.ToDouble(temp) > 2.0)
                {
                    first = temp;
                }
                else
                {
                    goto gt;
                }
                });
                return first;
                thr.IsBackground = true;
                thr.Start();
               

            
        }

только он теперь невозвращает переменую first вернее возвращает но она ничего несодержит. Если кто знает подскажите как с этим справится

Автор: golfV 3.2.2010, 17:39
вопрос решен, поставил 
Код

thr.Join();

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)