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


Автор: Curle 18.1.2006, 17:22
Подскажите как создать поток на public string Name(string s)?

Автор: arilou 18.1.2006, 17:42
Curle
Если ты имеешь ввиду запустить метод Name(string) в отдельном потоке, то

Код

using System.Windows.Forms;

class myclass
{
  public string Name(string p)
  {
     MethodInvoker mi = new MethodInvoker(nameImpl);
     _miPParam = p;
     mi.BeginInvoke(null, null);
  }

  string _miPParam = string.Empty;
  void nameImpl()
  {
      // код, который был раньше в Name
  }
}


Это быстрое решение без дополнительной работы. Можно вместо MethodInvoker использовать свой делегат с такими параметрами, как тебе нужно.

Автор: Curle 20.1.2006, 11:00
Код

public string Name(string p) //ругается на string, return'а то нету
...
string _miPParam = string.Empty;    
  void nameImpl()    
  {    
      //здесь нельзя использовать return ""
  }

Автор: -ser- 20.1.2006, 11:11
если честно, я тоже не понял, поскольку MethodInvoker может использоваться только для void методов. просто используй делегат. ты какую версию .нет используешь 1.1 или 2.0?

Автор: arilou 20.1.2006, 11:29
Цитата(-ser- @ 20.1.2006, 11:11 Найти цитируемый пост)

если честно, я тоже не понял, поскольку MethodInvoker может использоваться только для void методов


Интересно, как при асинхронной работе можно вернуть значение из метода? Поэтому только для void методов это получится.

Автор: -ser- 20.1.2006, 12:40
с MethodInvoker согласен, работает.
Цитата
как при асинхронной работе можно вернуть значение из метода

дождаться его завершения, например так
Код

        class MyClass
        {
            string _miPParam = string.Empty;
            
            public string Name( string p )
            {
                MethodInvoker mi = new MethodInvoker( nameImpl );
                _miPParam = p;
                IAsyncResult iar = mi.BeginInvoke( null, null );
                mi.EndInvoke( iar );
                return _miPParam;
            }

            void nameImpl()
            {                
                _miPParam = _miPParam.Insert( 1, "+" );
            }
        }

а в противном случае у нас Name возвратит не вычисленное методом nameImpl() значение.

Автор: arilou 20.1.2006, 14:47
Цитата(-ser- @ 20.1.2006, 12:40 Найти цитируемый пост)

дождаться его завершения, например так

Дык! В чем смысл асинхронного запуска в данном случае, если ты тормозишь свой поток до завершения другого?

Автор: Curle 20.1.2006, 16:43
Цитата

ты какую версию .нет используешь 1.1 или 2.0?

2.0

MethodInvoker mi = new MethodInvoker(netImpl("test")); как можно так сделать?
создать поток с родным параметром?

Автор: mr.DUDA 20.1.2006, 17:15
Цитата(Curle @ 20.1.2006, 15:43 Найти цитируемый пост)
создать поток с родным параметром?


Так:
Код
using System;
using System.Threading;

class MyClass
{
    public delegate string MyMethodInvoker(string arg);

    public string Name(string arg)
    {
        MyMethodInvoker inv = new MyMethodInvoker(nameImpl);
        IAsyncResult iar = inv.BeginInvoke(arg, null, null);

        // ...поток работает...
        while(!iar.IsCompleted) Thread.Sleep(10);

        return inv.EndInvoke(iar);
    }

    string nameImpl(string arg)
    { 
        return "blablabla - " + arg;
    }

    public MyClass() {}
}


class TestApp
{
    [STAThread]
    static void Main(string[] args)
    {
        Console.WriteLine(new MyClass().Name("test"));
    }
}

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