c# - C#:“類型'System.InvalidOperationException'的第一次機會異常”





crash (4)


這裡的問題是你的計時器啟動一個線程,當它運行回調函數時,回調函數(updatelistview)正在訪問UI線程上的控件,所以這不能做到this一點,因為this

在C#中進行類分配,我遇到了程序崩潰而沒有任何錯誤(除了VS2010的調試窗口中寫的內容)。 以下是導致崩潰的典型代碼:

public partial class Test : Form
{
    public Test()
    {
        InitializeComponent();
    }

    private void Test_Load(object sender, EventArgs e)
    {
        ColumnHeader header;

        header = new ColumnHeader();
        header.Text = "#";
        header.TextAlign = HorizontalAlignment.Center;
        header.Width = 30;
        listView1.Columns.Add(header);

        TimerCallback tcb = this.UpdateListView;

        System.Threading.Timer updateTimer = new System.Threading.Timer(tcb, null, 0, 1000);
    }

    public void UpdateListView(object obj)
    {
        ListViewItem item;
        listView1.Items.Clear();

        for (int i = 0; i < 10; i++)
        {
            item = new ListViewItem(i.ToString());

            listView1.Items.Add(item);
        }

    }
}

......我在這裡錯過了什麼?

** 編輯 **

沒有錯誤,程序就像我調用System.Environment.Exit(0);一樣結束 System.Environment.Exit(0);

A first chance exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll
The program '[4644] ProgramTest.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0).
The program '[4644] ProgramTest.vshost.exe: Program Trace' has exited with code 0 (0x0).



如果在異常窗口(Visual Studio中為Ctrl + Alt + E)中檢查中斷時Thrown Common Language Runtime Exception ,則在調試異常時執行應該會中斷。

這可能會讓您對正在發生的事情有所了解。




對於GUI應用程序,請考慮使用System.Windows.Forms.Timer而不是System.Threading.Timer ,對於基於Windows消息隊列而不是專用線程或線程池的計時器。

在您的方案中,為了定期更新UI,它似乎特別合適,因為您實際上沒有後台工作或長計算要執行。 您只想定期執行必須在UI線程上執行的小任務。




它取決於您的字符串的編碼( ASCIIUTF-8 ,...)。

例如:

byte[] b1 = System.Text.Encoding.UTF8.GetBytes (myString);
byte[] b2 = System.Text.Encoding.ASCII.GetBytes (myString);

一個為什麼編碼很重要的小例子

string pi = "\u03a0";
byte[] ascii = System.Text.Encoding.ASCII.GetBytes (pi);
byte[] utf8 = System.Text.Encoding.UTF8.GetBytes (pi);

Console.WriteLine (ascii.Length); //Will print 1
Console.WriteLine (utf8.Length); //Will print 2
Console.WriteLine (System.Text.Encoding.ASCII.GetString (ascii)); //Will print '?'

ASCII根本不具備處理特殊字符的能力。

在內部,.NET框架使用UTF-16來表示字符串,因此如果您只想獲取.NET使用的確切字節,請使用System.Text.Encoding.Unicode.GetBytes (...)

有關更多信息,請參見.NET Framework (MSDN) 中的字符編碼





c# crash