简体   繁体   English

从C#中的其他类实例化线程方法

[英]Instantiating thread method from a different class in c#

Can someone point me how to deal with the following issue? 有人可以指出我如何处理以下问题吗? Basically, im trying to reuse code from the following example found at: http://www.codeproject.com/KB/threads/SynchronizationContext.aspx the only issue i dont understand is how i can instantiate the RUN method if it is found in a different class. 基本上,我试图重用以下示例中的代码: http : //www.codeproject.com/KB/threads/SynchronizationContext.aspx我唯一不了解的问题是如何实例化RUN方法(如果在其中找到)不同的阶级。 Please see following code. 请参见以下代码。

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);
}
}

EDIT: 编辑:

for instance, the run method is given me by someone else (another developer) and i need to run this method as a different thread in my UI thread (Main Thread or class Form1), however, whenever i run the thread (run method) i also need to update a ListBox mListBox using the UpdateUI method. 例如,run方法是由其他人(另一个开发人员)提供的,我需要将此方法作为UI线程(Main Thread或Form1类)中的另一个线程来运行,但是,每当我运行该线程时(run方法)我还需要使用UpdateUI方法更新ListBox mListBox

Run should be static if you want to execute it without instantiating it's parent class. 如果要在不实例化其父类的情况下执行它,则Run应该是静态的。 Also, Run should be exposed as public, depending on the scope of how you plan on using it. 另外, Run应该公开显示,具体取决于您计划使用它的范围。 eg 例如

public static void Run(object state) { ... }

Are you wanting to do something like this? 您是否想做这样的事情?

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

(This is assuming you change Run to public) (这是假设您将“运行”更改为“公开”)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM