[英]Reuse same single thread for same task again and again in wpf (c#) application without ThreadPool
单击按钮创建MVVM应用程序,其中应用程序要连接到服务器。 单击按钮后,将创建一个线程以连接到服务器,以使UI不会冻结并终止(超时为15秒)。 下次单击该按钮时,将再次创建新线程以连接到服务器并终止。
但是,第一次,我想创建一个新线程,然后,如果应用程序未关闭并且用户单击了同一按钮,那么我想重用该线程(不是新线程)来执行“连接”任务。
那可能吗?
下面是代码:
Class ConnectViewModel:BaseViewModel
{
public void ConnectToServer()
{
ConnectButtonEnable = false;
ConnectingServerText = Properties.Resources.TryingToConnectServer;
Thread thread = new Thread(new ThreadStart(connect));
thread.Start();
thread.Join();
}
public void connect()
{
bool bReturn = false;
UInt32 iCommunicationServer;
bReturn = NativeMethods.CommunicateServer(out iCommunicationServer);
if (!bReturn || NativeMethods.ERROR_SUCCESS != iCommunicationServer)
{
ConnectingServerText = Properties.Resources.UnableToConnectToServer;
}
else if (NativeMethods.ERROR_SUCCESS == iCommunicationServer)
{
ConnectingServerText = properties.Resources.SuccessfullyConnectedServer;
}
ConnectButtonEnable = true;
return;
}
}
您可以使用TPL实现此目的。
private Task previous = Task.FromResult(true);
public Task Foo()
{
previous = previous.ContinueWith(t =>
{
DoStuff();
});
return previous;
}
通过将每个操作安排为上一个操作的延续,可以确保每个操作直到完成之前都不会开始,同时仍在后台线程中运行所有操作。
不必担心创建和管理线程,只需使用ThreadPool.QueueUserWorkItem
它非常有效。
由于问题的措辞如何,我建议您阅读MVVM和异步模式,下面是一些示例:
但是通常,请使用async
,在GUI应用程序中编码时不要手动创建新线程。 如果在“运行”期间该任务不可调用,请通过Interlocked.CompareExchange
进行测试和设置,并保存一些状态。
您将线程用于并行工作,而不是用于“网络等待”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.