0

誰かが次の問題に対処する方法を教えてもらえますか? 基本的に、http: //www.codeproject.com/KB/threads/SynchronizationContext.aspxにある次の例のコードを再利用しようとしています 。 理解できない唯一の問題は、RUN メソッドが見つかった場合にインスタンス化する方法です。別のクラス。次のコードを参照してください。

public partial class Form1 : Form
{
public Form1()
{
    InitializeComponent();
}

private void mToolStripButtonThreads_Click(object sender, EventArgs e)
{
    // let's see the thread id
    int id = Thread.CurrentThread.ManagedThreadId;
    Trace.WriteLine("mToolStripButtonThreads_Click thread: " + id);

    // grab the sync context associated to this
    // thread (the UI thread), and save it in uiContext
    // note that this context is set by the UI thread
    // during Form creation (outside of your control)
    // also note, that not every thread has a sync context attached to it.
    SynchronizationContext uiContext = SynchronizationContext.Current;

    // create a thread and associate it to the run method
    Thread thread = new Thread(Run);

    // start the thread, and pass it the UI context,
    // so this thread will be able to update the UI
    // from within the thread
    thread.Start(uiContext);
}


// THIS METHOD SHOULD GO IN A DIFFERENT CLASS (CLASS2) SO HOW TO CALL METHOD UpdateUI()
private void Run(object state)
{
    // lets see the thread id
    int id = Thread.CurrentThread.ManagedThreadId;
    Trace.WriteLine("Run thread: " + id);

    // grab the context from the state
    SynchronizationContext uiContext = state as SynchronizationContext;

    for (int i = 0; i < 1000; i++)
    {
        // normally you would do some code here
        // to grab items from the database. or some long
        // computation
        Thread.Sleep(10);

        // use the ui context to execute the UpdateUI method,
        // this insure that the UpdateUI method will run on the UI thread.

        uiContext.Post(UpdateUI, "line " + i.ToString());
    }
}

/// <summary>
/// This method is executed on the main UI thread.
/// </summary>
private void UpdateUI(object state)
{
    int id = Thread.CurrentThread.ManagedThreadId;
    Trace.WriteLine("UpdateUI thread:" + id);
    string text = state as string;
    mListBox.Items.Add(text);
}
}

編集:

たとえば、実行メソッドは他の人 (別の開発者) から与えられ、UI スレッド (メイン スレッドまたはクラス Form1) で別のスレッドとしてこのメ​​ソッドを実行する必要がありますが、スレッド (実行メソッド) を実行するたびにmListBoxUpdateUI メソッドを使用してListBox を更新する必要もあります。

4

2 に答える 2

0

Run親クラスをインスタンス化せずに実行する場合は、静的にする必要があります。また、Run使用方法の範囲に応じて、パブリックとして公開する必要があります。例えば

public static void Run(object state) { ... }
于 2012-01-17T20:28:43.093 に答える
0

このようなことをしたいですか?

Foo foo = new Foo();
var thread = new Thread(foo.Run);

(これは、Run を public に変更したことを前提としています)

于 2012-01-17T20:29:41.747 に答える