每次调用特定方法时都创建一个新的后台线程

时间:2011-03-13 16:23:55

标签: c# winforms multithreading

的WinForm: 我的MainApplication中有一个名为check_news的方法。 如何在每次调用方法时(通过按下按钮或在程序的开头)创建并运行一个可在后台处理方法的线程?

我知道如何创建一个线程但是每次调用该函数时如何创建新线程(新线程因为旧线程死了)?

我应该创建一个新类并使用新的类对象和我需要的方法运行线程吗? 我应该在哪里定义线程?

3 个答案:

答案 0 :(得分:1)

您可以通过编写new Thread(...)在方法内创建一个线程 ...可以是方法名称,委托实例或匿名方法。

每次执行此代码时,它都会创建一个新的Thread实例。

请注意,使用ThreadPool会更有效。

答案 1 :(得分:1)

我认为实现这一目标的最佳方法是将其添加到线程池中,这很简单快捷。

示例:

public static void Main(string[] args)
{
    check_news();
}

private static void check_news()
{
    ThreadPool.QueueUserWorkItem((obj) =>
        {
            // Fetch the news here
            Thread.Sleep(1000); // Dummy
        });
}

或者,如果你真的想自己处理它,你可以使用它:

public static void Main(string[] args)
{
    check_news();
    Console.ReadKey();
}

private static void check_news()
{
    Thread t = new Thread(() =>
        {
            // Check news here
            Thread.Sleep(1000); // Dummy
        });
    t.Priority = ThreadPriority.Lowest; // Priority of the thread
    t.IsBackground = true; // Set it as background (allows you to stop the application while news is fetching
    t.Name = "News checker"; // Make it recognizable
    t.Start(); // And start it
}

但是你应该知道这需要更长的时间才能启动,它不会重用线程,并且它没有真正的优势。

或者,如果您想要更多控制权,可以使用异步平台:

public static void Main(string[] args)
{
    check_news(); // You can add an argument 'false' to stop it from executing async
    Console.WriteLine("Done");
    Console.ReadKey();
}

public delegate void Func();

public static void check_news(bool async = true)
{
    Func checkNewsFunction = () =>
        {
            //Check news here
            Thread.Sleep(1000);
        };
    if (async)
    {
        AsyncCallback callbackFunction = ar =>
        {
            // Executed when the news is received

        };
        checkNewsFunction.BeginInvoke(callbackFunction, null);
    }
    else
        checkNewsFunction();
}

请注意,所有示例中的lambda表达式也可以由常规函数替换。但我现在只是使用它们,因为它看起来更好。

答案 2 :(得分:1)

    public void Example()
    {
        //call using a thread.
        ThreadPool.QueueUserWorkItem(p => check_news("title", "news message"));
    }

    private void check_news(string news, string newsMessage)
    {

    }