Получение информации обратно в основной поток из вызываемого потока? - PullRequest
2 голосов
/ 22 июля 2011

У меня есть «строка» и «StreamReader» в основном потоке.Я хочу передать их потоку, который будет читать потоковый ридер в строку.Я хочу, чтобы эта строка была изменена в главном потоке.У меня вопрос, как мне это сделать?

Дополнительная информация: У меня есть конкретные причины, по которым я хочу проделать это, поэтому просто придерживайтесь спецификаций.Кроме того, я не могу использовать TPL, потому что не могу получить фреймворк 4.0 ... Опять же по определенным причинам.

Ответы [ 3 ]

7 голосов
/ 22 июля 2011

Итак, вы создаете класс со свойствами string и StreamReader.Вы передаете экземпляр этого класса другому потоку, используя ParameterizedThreadStart.У вас есть другой поток, который заполняет этот лютик, записывая в свойство string этого экземпляра вашего класса.

Когда поток завершится, ваше свойство string в экземпляре вашего класса будет заполненовверх.Yay.

Так что-то вроде

 class Foo {
     public string Bar { get; set; }
 }

Тогда:

 Foo foo = new Foo();
 var thread = new Thread(o => { Foo f = (Foo)o; f.Bar = "FillMeUpButterCup"; });
 thread.Start(foo);
 thread.Join();
 Console.WriteLine(foo);

Ух ты!

Я остановился на StreamReader, но теперь ты получаешьточка.

1 голос
/ 22 июля 2011

При создании потока у вас есть ParameterizedThreadStart делегат и параметр, который вы можете передать туда.Просто создайте класс с двумя свойствами - string и StreamReader (и, возможно, все, что вы хотите там передать) и передайте экземпляр класса в метод запуска потока.

public class ThreadStartParam
{
    public string Str { get; set; }
    public StreamReader StreamReader { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var t = new Thread(YourMethod);

        var param = new ThreadStartParam();
        param.Str = "abc";
        param.StreamReader = new StreamReader();

        t.Start(param);
    }

    static void YourMethod(object param)
    {
        var p = (ThreadStartParam) param;
        // whatever
    }
}
0 голосов
/ 22 июля 2011

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

http://coreyogburn.com/post/Threads-Doing-Them-Right-wGUI.aspx

Более конкретно, в вашем примере основного потока, реализующего измененную строку, которую вы передаете потоку, я бы порекомендовал, чтобы при завершении потока вы вызывали метод, который возвращал строковое значение обратно и сбрасывал исходное значение строки. Это предотвратит добавление потока в строку, в то время как основной поток может попытаться прочитать ее.

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