尝试完成我用C#编写的小窗口应用程序。我构建它没有错误,因为变量“e”从未使用过 当我在构建之后运行程序时没有任何事情发生,并且在事件查看器中我得到.net运行时错误(粘贴在下面)。 代码:
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
private Thread thread;
public Form1()
{
InitializeComponent();
richTextBox1.Text = "Epic pinger";
Form1.ActiveForm.FormClosing += new FormClosingEventHandler(Form1_Closing);
}
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (thread != null)
{
thread.Abort();
}
}
public void ping()
{
string textb1 = textBox1.Text;
try
{
while (true)
{
if (textb1 == "")
{
return;
}
using (Ping p = new Ping())
{
//Konfigurerings boksene int/strings
string msStørreKonf2 = msKonfig2.Text;
string msStørre = textBox2.Text;
int msStørst = 100;
int msKonf2t = 100;
Int32.TryParse(msStørreKonf2, out msKonf2t);
Int32.TryParse(msStørre, out msStørst);
this.Invoke((MethodInvoker)delegate
{
try
{
listView1.Items.Add(p.Send(textBox1.Text).RoundtripTime.ToString() + "ms\n");
if (p.Send(textBox1.Text).RoundtripTime > msStørst) { Console.Beep(1500, 400); } //konfig boks 1
if (p.Send(textBox1.Text).RoundtripTime > msKonf2t) { Console.Beep(6500, 700); } //konfig boks 2
listView1.EnsureVisible(listView1.Items.Count - 1);
}
catch (PingException e)
{
Console.Beep(5000, 100);
richTextBox1.AppendText("Error med ping addressen eller pip konfigurasjon! ");
}
});
//Søvetid, henter input fra tidsBox.
string tidPingString = tidsBox.Text;
int tidPing = 1000;
Int32.TryParse(tidsBox.Text, out tidPing);
Thread.Sleep(tidPing);
// testing:
}
}
}
catch (ThreadAbortException e)
{
// Ska vær blank!
}
}
private void button1_Click(object sender, EventArgs e)
{
if (thread != null && thread.IsAlive)
{
thread.Abort();
listView1.Items.Add("|");
}
else
{
thread = new Thread(new ThreadStart(ping));
thread.Start();
}
}
错误XML视图:
- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
<Provider Name=".NET Runtime" />
<EventID Qualifiers="0">1026</EventID>
<Level>2</Level>
<Task>0</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2016-06-30T07:40:42.499533800Z" />
<EventRecordID>40977</EventRecordID>
<Channel>Application</Channel>
<Computer>computername.domainname</Computer>
<Security />
</System>
- <EventData>
<Data>Application: EndlessP.exe Framework Version: v4.0.30319 Description: The process was terminated due to an unhandled exception. Exception Info: System.NullReferenceException at WindowsFormsApplication2.Form1..ctor() at WindowsFormsApplication2.Program.Main()</Data>
</EventData>
</Event>
它已经解决,请查看评论以查看解决方案。如果我可以尝试在此处添加解释原因。
答案 0 :(得分:4)
Form1.ActiveForm
将为null
。您需要为当前表单实例设置事件,该事件只是this
:
this.FormClosing += new FormClosingEventHandler(Form1_Closing);
最好不要手动附加事件,而是使用表单的属性窗口。
说明:Form.ActiveForm
属性设置为当前活动的表单实例。在各种情况下,此属性可能为null
,例如,当表单的实例不是活动时也是如此。这是你的问题。当构造函数执行时,有一个表单实例,但它尚未显示,因此不活动。
因此使用ActiveForm
附加事件甚至可能很危险!想象一下,当您的表单已经存在并且其中一个可见时,就会出现这种情况。现在您创建另一个实例。该事件将附加到当前活动的实例(可能是完全不同的实例),而不是当前实例。
答案 1 :(得分:2)
如果您收到NullReference Exception的错误,那么它表示您正在尝试访问指向null的字段,函数类型。因此,最好检查分配的值是否为null。 例如
string myname=null;
if (myname.Length == 0) // will generate exception
{
Console.WriteLine(myname); //it will never get here.
}