【发布时间】:2017-08-10 15:56:36
【问题描述】:
不用说我是 C# 新手,并且在此过程中会做一些基本的事情来学习。我正在尝试了解异步/等待功能。我有一个带有 2 个文本框和一个按钮的表单。当我单击该按钮时,它会检查远程计算机的服务状态(在这种情况下是远程注册表。在检查时,它会写入它正在检查注册表并告诉用户等待。然后如果状态停止则启动并获取一些值我查找并将它们写入第二个文本框。
我的代码有效,并且我能够获得我的价值观。但 GUI 在此期间冻结。我试图实现 backgroundworker、thread 和 Async/Wait,但没有成功。我试着做任务,但无法让它发挥作用。
这里或其他网站上显示的所有示例都简单地返回 int,而我试图返回一个将状态和值写入文本框的字符串。我试图将其转换为字符串但没有成功。
长话短说,对于这种类型的流程,有什么更好的方法?有人可以告诉我如何并评论一路上做什么,以便我更好地理解吗?我想学习如何做到这一点,但同时要了解原因并学习编写更简洁的代码。
感谢大家提前抽出时间。
string ComputerName = "Lab01";
public frmRegChecker()
{
InitializeComponent();
}
private void Button1_Click(object sender, EventArgs e)
{
Check_Status();
}
private void Check_Status()
{
TxtBoxstatus.AppendText("Checking Remote Registry service status on computer : " + ComputerName);
TxtBoxstatus.AppendText(Environment.NewLine);
TxtBoxstatus.AppendText("Please wait... ");
ServiceController sc = new ServiceController("RemoteRegistry", ComputerName);
try
{
TxtBoxstatus.AppendText("The Remote Registry service status is currently set to : " + sc.Status.ToString());
TxtBoxstatus.AppendText(Environment.NewLine);
if (sc.Status == ServiceControllerStatus.Stopped)
{
// Start the service if the current status is stopped.
TxtBoxstatus.AppendText("Starting Remote Registry service...");
TxtBoxstatus.AppendText(Environment.NewLine);
try
{
// Start the service, and wait until its status is "Running".
sc.Start();
sc.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 3));
sc.Refresh();
sc.WaitForStatus(ServiceControllerStatus.Running);
// Display the current service status.
TxtBoxstatus.AppendText("The Remote Registry status is now set to:" + sc.Status.ToString());
richTextBox1.AppendText(Environment.NewLine);
try
{
var reg = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, ComputerName);
var key = reg.OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion\");
string _OSVersion = (key.GetValue("CurrentVersion")).ToString();
richTextBox1.AppendText("OS version is : " + _OSVersion);
richTextBox1.AppendText(Environment.NewLine);
}
catch (InvalidOperationException)
{
richTextBox1.AppendText("Error getting registry value from" + ComputerName);
richTextBox1.AppendText(Environment.NewLine);
}
}
catch (InvalidOperationException)
{
richTextBox1.AppendText("Could not start the Remote Registry service.");
richTextBox1.AppendText(Environment.NewLine);
}
}
else if (sc.Status == ServiceControllerStatus.Running)
{
try
{
var reg = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, ComputerName);
var key = reg.OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion\");
string _OSVersion = (key.GetValue("CurrentVersion")).ToString();
richTextBox1.AppendText("OS version is : " + _OSVersion);
richTextBox1.AppendText(Environment.NewLine);
}
catch (InvalidOperationException)
{
richTextBox1.AppendText("Error getting registry value from" + ComputerName);
richTextBox1.AppendText(Environment.NewLine);
}
}
}
}
catch
{
richTextBox1.AppendText("Error getting registry value from " + ComputerName);
richTextBox1.AppendText(Environment.NewLine);
}
}
【问题讨论】:
-
后台工作人员应该为此工作,而这正是他们设计的工作。后台工作人员遇到了什么问题?
-
您好,埃里克,感谢您的快速回复。我在 backgroundworker 中看到的示例都带有进度条,它向标签结果报告整数。我只是无法实现它如何将我的状态报告以字符串形式返回到文本框。我收到错误,例如您无法从其他控件类型的内容访问文本框。
-
您说您无法使
async解决方案正常工作,但您根本没有显示任何异步代码。 -
您好 Servy,我不确定要使用哪种解决方案以及为什么。这就是为什么我先问这个的原因。有太多方法可以做我想做的事情,我正在努力学习最干净但最好的方法。
-
@Besiktas 你说你写了一个异步解决方案,但是它没有工作,你还没有展示一个异步解决方案。展示你的异步解决方案,并解释为什么它不起作用。
标签: c# multithreading async-await backgroundworker