2009-05-01 5 views
28

以下の方法は、私がそのスレッドで実行されるようにしたいものです。スレッドを作成するには?

public void Startup(int port,string path) 
{ 
    Run(path); 
    CRCCheck2(); 
    CRCCheck1(); 
    InitializeCodeCave((ushort)port); 
} 

私はグーグルで見つけることができるものを試してみましたが、何も実行する方法を、コンパイルされません両方

public void Test(int port,string path) 
{ 
    Thread t = new Thread(Startup(port,path)); 
} 

public void TestA(int port,string path) 
{ 
    Thread t = new Thread(Startup); 
    t.Start (port,path); 
} 

を働いていませんそれ?

+1

が機能しない、またはコンパイルされない – Aziz

+0

私が推測する必要がないように、使用する言語を指定する必要があります。また、何がうまくいかないと言っている。 – tuergeist

+1

質問タグを確認してください - C# コンパイルされません。 –

答えて

51

次のように動作します。

// The old way of using ParameterizedThreadStart. This requires a 
// method which takes ONE object as the parameter so you need to 
// encapsulate the parameters inside one object. 
Thread t = new Thread(new ParameterizedThreadStart(StartupA)); 
t.Start(new MyThreadParams(path, port)); 

// You can also use an anonymous delegate to do this. 
Thread t2 = new Thread(delegate() 
{ 
    StartupB(port, path); 
}); 
t2.Start(); 

// Or lambda expressions if you are using C# 3.0 
Thread t3 = new Thread(() => StartupB(port, path)); 
t3.Start(); 

これらの例では、起動メソッドに次のシグニチャがあります。

public void StartupA(object parameters); 

public void StartupB(int port, string path); 
+1

"古い方法"を使用するとエラーが発生しますが、lamba式は完璧に動作します。 :) –

+1

必要なスタートアップメソッドの署名を明確にしました。 –

+0

ニース - 私はちょうど "古い"方法を使用して以下の回答を投稿しましたが、ラムダ式を使用してよりクリーンなスレッドエントリポイントを作成することはできませんでした。 –

7

実行する方法は、ThreadStart Delegateである必要があります。 MSDNのThread documentationにご相談ください。クロージャを使用して2つのパラメータの開始点を並べ替えることができます。次のようなものがあります。

var t = new Thread(() => Startup(port, path)); 

メソッドのアクセシビリティを再訪することをお勧めします。私がこのように独自のパブリックメソッドでスレッドを開始するクラスを見た場合、私はちょっと驚いたでしょう。

+0

私はこれを試して、それは動作しません。 ThreadStart t =新しいThreadStart(スタートアップ)。 << 'Startup'のオーバーロードはdelegate 'System.Threading.ThreadStartと一致しません。 –

+0

スタートアップには2つのパラメータがあります。リンクしたドキュメントをチェックすると、ThreadStartにはパラメータはありません。クロージャを使用して2つのように見せる(3.5)か、ParameterizedThreadStartを使用して2つのパラメータをオブジェクト(3.5より前)にバンドルすることができます。 –

2
public class ThreadParameter 
     { 
      public int Port { get; set; } 
      public string Path { get; set; } 
     } 


Thread t = new Thread(new ParameterizedThreadStart(Startup)); 
t.Start(new ThreadParameter() { Port = port, Path = path}); 

オブジェクトを作成して、Startupメソッドに渡します。

+0

ちょうど私が最初の行を書くとき、私は "Startup"のオーバーロードがdelegate 'System.Threading.ParameterizedThreadStart "と一致しません。 –

+0

スタートアップは" Startup(object parameters) "を無効にする必要があります。オブジェクトを渡すことができないので、 "void Startup(ThreadParameter parameters)"を使うことはできません。スタートアップの内部でオブジェクトパラメータをThreadParameterにキャストできます。 –

+0

ThreadParameterクラス.....(2つのパラメータで作成したクラス)を受け入れるようにStartupメソッドの署名を変更する必要があります。 – CSharpAtl

2

スレッドメソッドが1つまたは0の引数を取るため、この例は失敗します。渡す引数なしでスレッドを作成するには、あなたのコードは次のようになります。

void Start() 
{ 
    // do stuff 
} 

void Test() 
{ 
    new Thread(new ThreadStart(Start)).Start(); 
} 

あなたがスレッドにデータを渡したい場合、あなたはそれがのカスタムクラスであるかどうか、1つのオブジェクトにデータをカプセル化する必要がありますあなたの独自のデザイン、辞書オブジェクトなどがあります。あなたはそのようにように、ParameterizedThreadStartデリゲートを使用する必要があります。

void Start(object data) 
{ 
    MyClass myData = (MyClass)myData; 
    // do stuff 
} 

void Test(MyClass data) 
{ 
    new Thread(new ParameterizedThreadStart(Start)).Start(data); 
} 
7

私はSystem.Threading.Tasksからタスクの工場が好きです。

Task.Factory.StartNew(() => 
{ 
    // Whatever code you want in your thread 
}); 

タスクの工場はあなたにContinueWithのような追加の便利なオプションを与えることに注意してください:あなたはこのような何かを行うことができます

Task.Factory.StartNew(() => {}).ContinueWith((result) => 
{ 
    // Whatever code should be executed after the newly started thread. 
}); 

また、タスクはスレッドよりもわずかに異なる概念であることに注意してください。彼らは、非同期/待望のキーワードにうまく収まります(hereを参照)。

関連する問題