的WinForm: 我的MainApplication中有一个名为check_news的方法。 如何在每次调用方法时(通过按下按钮或在程序的开头)创建并运行一个可在后台处理方法的线程?
我知道如何创建一个线程但是每次调用该函数时如何创建新线程(新线程因为旧线程死了)?
我应该创建一个新类并使用新的类对象和我需要的方法运行线程吗? 我应该在哪里定义线程?
答案 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)
{
}