2014年7月1日 星期二

C# How to Remove Back Slashes from JSON Response in Self Host ?


研究好久結果簡單的定義就解決了


 public HttpResponseMessage meg()
        {

            string output="something";
            return new HttpResponseMessage()
            {
                Content = new StringContent(output, System.Text.Encoding.UTF8, "application/json")
            };
       
        }

C# 如何使用多執行緒 Thread / 跨執行緒存取UI



System.Threading 命名空間提供了執行緒的建立,讓開發者省去了不少程式碼。
使用多執行緒時先匯入System.Threading
如何建立執行緒
1.建立一個方法
  private void RunSample01()
  {
  Console.WriteLine("執行緒:{0}",Thread.CurrentThread.ManagedThreadId);
  }
2.建立ThreadStart委派,它是用來表示在執行緒上執行的方法。
 ThreadStart myRun = new ThreadStart(RunSample01);

3.建立Thread 類別,它是用來建立和控制執行緒,設定執行緒的優先權,並取得它的狀態。
 Thread myThread = new Thread(myRun);
4.啟動執行緒
 myThread.Start();



如何建立多重執行緒
  private void button2_Click(object sender, EventArgs e)
  {
  //1.建立ThreadStart委派
  ThreadStart myRun = new ThreadStart(RunSample01);
  for (int i = 0; i < 6; i++)
  {
  try
  {
  //2.建立Thread 類別
  Thread myThread = new Thread(myRun);
  //3.啟動執行緒
  myThread.Start();
  }
  catch (Exception)
  {
  //例外發生則終止迴圈執行
  break;
  }
  }
   
  }
如何傳遞參數給多執行緒
ThreadStart委派沒有傳遞參數的功能,在實際應用上我們常需要傳遞參數,這時就要改用ParameterizedThreadStart 委派ParameterizedThreadStart 委派用法與ThreadStart委派大同小異,只是多了參數傳遞機制。
  private void button3_Click(object sender, EventArgs e)
  {
  //1.建立ParameterizedThreadStart委派
  ParameterizedThreadStart myPar = new ParameterizedThreadStart(RunSample02);
  //2.建立Thread 類別
  Thread myThread01 = new Thread(myPar);
  Thread myThread02 = new Thread(myPar);
  //3.啟動執行緒並帶入參數
  myThread01.Start("我是多執行緒第一號");
  myThread02.Start("我是多執行緒第二號");
  }        
  private void RunSample02(object o)
  {
  string myStr = o as string;
  //string myStr = (string)o;
  if (myStr == null)
  {
  myStr = (string)o;
  }
  else
  {
  for (int i = 0; i < 6; i++)
  {
  Console.WriteLine("{0}:{1}", myStr, Thread.CurrentThread.ManagedThreadId);
  Thread.Sleep(1000);
  }
  }
  }

如何跨執行緒存取UI
當我試著用WinFrom寫多執行緒時,卻出現了以下錯誤訊息
跨執行緒作業無效: 存取控制項 'textBox1' 時所使用的執行緒與建立控制項的執行緒不同。
詢問高手後有三種方法解決:
1.Form.CheckForIllegalCrossThreadCalls = False
2.建立委派
第一種方法,據說不安全,但我也不曉得哪裡不安全,但用起來還蠻方便的。
第二種方法,比較正統使用委派的方式,若爾後需要改任何控制項的文字時(需有text屬性的),呼叫 myU即可。
  private delegate void myUICallBack(string myStr, Control ctl);
  private void myUI(string myStr, Control ctl)
  {
  if (this.InvokeRequired)
  {
  myUICallBack myUpdate = new myUICallBack(myUI);
  this.Invoke(myUpdate, myStr, ctl);
  }
  else
  {
  ctl.Text = myStr;
  }
  }




第三種方法,使用BackgroundWorker,更強大的功能讓我們省去了上述繁雜的動作。

更詳細的UI跨執行緒請參考:Windows Form UI優化入門課 – 非同步作業
C#範例下載:C#.NET多執行緒.rar

C# thread 不能直接對控制項取值,必須使用 invoke + delegate

跨執行緒傳值作業無效的解決方法

1.建立委派傳值

public delegate void ModifyTextBoxDelegate(String s);
private void ModifyTextBox(String s)
{
if (textBox1.InvokeRequired)
{
ModifyTextBoxDelegate d = new ModifyTextBoxDelegate(ModifyTextBox);
this.Invoke(d, s);
}
else
{
textBox1.Text = s;
}
}


2.設定可接受其他Thread傳值

Form.CheckForIllegalCrossThreadCalls = False

方便但是很危險的作法
直接就不檢查是否跨thread來存取UI