WinFrom在執行緒下存取From上的物件會出現以下錯誤:
此時有三種方式可以解決,建議使用委派方式:
直接允許Cross Thread:
在WinFrom Load中加入:Form.CheckForIllegalCrossThreadCalls = false;
如果要判斷Thread執行完畢,才繼續執行程式,此時可以使用Join即可達到等待作用。
using System; using System.Collections.Generic; using System.Threading; namespace Test { class Program { static void Main(string[] args) { List<Thread> List_Thread = new List<Thread>(); for (int i = 0; i < 10; i++) { //建立執行緒 List_Thread.Add(new Thread((object x) => { int temp = 3; while (temp-- > 0) { Console.WriteLine("Thread ID :" + x.ToString() + "\t" + temp.ToString()); System.Threading.Thread.Sleep(1000); } })); List_Thread[i].Start(i + 1); } //等待所有執行緒完成 foreach (Thread t in List_Thread) t.Join(); Console.WriteLine("End"); } } }
基本的Thread寫法
using System; using System.Threading; namespace Test { class Program { static void Main(string[] args) { Thread t = new Thread(new ThreadStart(ThreadFun)); t.Start(); } static void ThreadFun() { int x = 0; while (++x > 0) Console.WriteLine(x.ToString()); } } }
如果寫Console模式,就會發現只有一個Thread無法同時接收及輸出。
此時只要運用 Thread 達到 顯示 及 接收ESC!
原理就是多建立一個Thread執行程式用,另外一個監測ESC事件用。
using System; using System.Threading; namespace Test { class Program { static void Main(string[] args) { //產生Thread輸出數字1,2,3.... Thread t = new Thread(() => { int x = 0; while (++x > 0) Console.WriteLine(x.ToString()); }); t.Start(); //當使用者按下ESC停止Thread while (Console.ReadKey(true).Key != ConsoleKey.Escape) ; t.Abort(); } } }
使用C#將圖片檔案轉為Icon檔案。
首先必須先準備16x16的小圖檔案,然後利用程式將他轉為Icon檔案。
//將圖檔設定給 bitmap 物件存放,並設定大小。 Bitmap myBitmap = new Bitmap(Image.FromFile(filePath ), 16, 16); IntPtr Hicon = myBitmap.GetHicon(); Icon newIcon = Icon.FromHandle(Hicon); FileStream outStream = new FileStream(@"c:\a.ico", FileMode.OpenOrCreate); newIcon.Save(outStream); outStream.Flush(); outStream.Close();
使用C#取得DNS的正反解,可以使用IP取得Domain或是Domain取得IP。
using System.Net; using System.Net.Sockets; namespace Test { class Program { static void Main(string[] args) { //取得主機名稱 string HostName = "www.hinet.net"; Console.WriteLine("{0} 所對應的 IP 位址如下 : ", HostName); IPHostEntry myAddress = Dns.GetHostEntry(HostName); IPAddress[] myIPAddress = myAddress.AddressList; foreach (IPAddress add in myIPAddress) Console.WriteLine(add); //取得IP位址 string Address = "192.168.1.1"; Console.WriteLine("{0} 所對應的 主機名稱 如下 : ", Address); IPHostEntry myHostName = Dns.GetHostEntry(Address); Console.WriteLine(myHostName.HostName.ToString()); } } }
如果有路徑需要組合,不需要透過字串組合,只要使用Path即可。
string PathStr = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "a.txt"); Console.WriteLine(PathStr);
//目前程式目錄 string ApplicationBase = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase; //Windows目錄 string winDir = System.Environment.GetEnvironmentVariable("windir"); //桌面目錄 string folder = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
// 系統特殊目錄
// Environment.SpecialFolder
Desktop: C:\Documents and Settings\Administrator\桌面
Programs: C:\Documents and Settings\Administrator\「開始」功能表\程式集
Personal: D:\My Documents
Favorites: C:\Documents and Settings\Administrator\Favorites
Startup: C:\Documents and Settings\Administrator\「開始」功能表\程式集\啟動
Recent: C:\Documents and Settings\Administrator\Recent
SendTo: C:\Documents and Settings\Administrator\SendTo
StartMenu: C:\Documents and Settings\Administrator\「開始」功能表
MyMusic: D:\My Documents\My Music
DesktopDirectory: C:\Documents and Settings\Administrator\桌面
利用.Net 的 System.Net.NetworkInformation.Ping 測試網路是否正常!
System.Net.NetworkInformation.Ping NetPing = new System.Net.NetworkInformation.Ping(); System.Net.NetworkInformation.PingReply NetPingReply = NetPing.Send("168.95.1.1", 5000); if(NetPingReply.Status == System.Net.NetworkInformation.IPStatus.Success) { MessageBox.Show("OK"); } else { MessageBox.Show("ERROR"); }
如下就能直接讀取File Upload 的檔案內容
StreamReader SR = new StreamReader(this.FI.PostedFile.InputStream, System.Text.Encoding.Default); string body = SR.ReadToEnd();