2011-07-22 13 views
2

私はメインスレッドに "string"と "StreamReader"を持っています。ストリームリーダーを文字列に読み込むスレッドにこれらを渡したいと思います。メインスレッドでその文字列を変更したい。私の質問は私がこれをどうやってするのか?呼び出されたスレッドからメインスレッドに情報を戻すか?

追加情報:なぜ私はこれをスレッドにしたいのかという特定の理由がありますので、仕様に固執してください。また、フレームワーク4.0を手に入れることができないため、私はTPLを使用できません。

答えて

7

したがって、stringStreamReaderというプロパティを持つクラスを作成します。 ParameterizedThreadStartを使用して、そのクラスのインスタンスを別のスレッドに渡します。あなたはあなたのクラスのインスタンス上のstringプロパティに書き込むことによって、他のスレッドがそのバナナップを埋めるようにしています。

スレッドが完了すると、クラスのインスタンスのstringプロパティが埋められます。わーい。

それでは

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

スレッドを作成するときに、ParameterizedThreadStartデリゲートとそこに渡すことができるパラメータがあります。 stringStreamReaderの2つのプロパティを持つクラスを作成し、そこに渡したいものを作成し、クラスのインスタンスをスレッド開始メソッドに渡します。

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

私は去年のいつかのブログ投稿を書きました。スレッドと通信してスレッドから正しく通信する方法を説明します。スレッドとの間でやりとりするオブジェクトを基本的に作成し、ParameterizedThreadStartを使用してスレッドに渡すことができます。また、デリゲートを呼び出すことで戻すこともできます。あなたがスレッドに渡す変更文字列を実現するメインスレッドのあなたの例で具体的に

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

、私はあなたが戻ってと再文字列値を渡すメソッドを呼び出し、スレッドの完了時にそのをお勧めします元の文字列の値を設定します。これにより、メインスレッドがスレッドを読み込もうとしている間にスレッドが文字列に追加されなくなります。