2008年6月14日 星期六

ThreadPool 的用法

在多層式架構(N Tier Architecture)下, 中介層(Middle Tier)擔任工作分派(Dispatch)的任務, 接受前端程式的委託, 將各項工作以非同步方式同時執行, 執行後再將結果傳回; 這時我們常會碰到一個問題, 若前端程式的短時間內委託的工作過多, 會造成中介層負擔過重, 可能會使伺服器當機。因此中介層必須設定工作佇列(Task Queue), 讓過多的工作緩一緩, 等待前面委託的工作處理完, 再從佇列中取出執行, 這就是ThreadPool的功能。

以下是一個簡單的console程式範例, 唯一要注意的是執行緒內一定要用try...catch, 讓執行緒能正常結束。

Imports System
Imports System.Threading
Module Module1
' 非同步工作總數
Private mTaskCount As Integer = 3
Sub Main()
Dim mCompletionEvent As New AutoResetEvent(False) '全部工作完成的通知事件
Dim objStopWatch As New Stopwatch ' 馬錶
objStopWatch.Start() ' 啟動馬錶

' 設定集區的最大執行數及IO數
ThreadPool.SetMaxThreads(1, 1)

' 所有工作送入集區
For i As Integer = 1 To mTaskCount
' 設定執行緒參數
Dim objThreadParameters As New ThreadParametersClass
objThreadParameters.mThreadNumber = i
objThreadParameters.mCompletionEvent = mCompletionEvent

' 工作送入集區
ThreadPool.QueueUserWorkItem(New WaitCallback( _
AddressOf MyAsyncOperation), objThreadParameters)
Next
' 等待全部工作完成的事件通知
mCompletionEvent.WaitOne()

' 停止馬錶並顯示耗費時間
objStopWatch.Stop()
MsgBox(objStopWatch.ElapsedMilliseconds)
End Sub


' 執行緒之工作內容
Sub MyAsyncOperation(ByVal mThreadParameters As Object)
' 取得參數
Dim objThreadParameters As ThreadParametersClass = _
CType(mThreadParameters, ThreadParametersClass)
' 擷取錯誤
Try
Console.WriteLine("WorkItem {0} thread: Performing asynchronous operation.", _
objThreadParameters.mThreadNumber)

' 製造錯誤
If objThreadParameters.mThreadNumber = 2 Then
Dim ds As New DataSet
Console.WriteLine(ds.Tables(0).Rows(0).Item(0))
End If
' 停5秒
Thread.Sleep(5000) ' Sleep for 5 seconds to simulate doing work
Catch
Finally
' 待完成工作數減一
If Interlocked.Decrement(mTaskCount) = 0 Then
CType(objThreadParameters.mCompletionEvent, AutoResetEvent).Set()
End If
End Try
End Sub

' 參數定義
Public Class ThreadParametersClass
Public mThreadNumber As Integer

' ' *****不能使用 new, 因為要使用公共變數 *****
Public mCompletionEvent As AutoResetEvent
End Class
End Module

2008年5月26日 星期一

新電腦語言的介紹

這一期的MSDN雜誌介紹各種新電腦語言的特色, 簡潔扼要, 值得一讀。
http://msdn.microsoft.com/en-us/magazine/cc507636(printer).aspx

摘要如下:

  1. Functional Programming: 將電腦計算視為數學運算式的解析, 把問題拆成多個function, 之後再將各個function串連起來算出答案, 其實就是所謂的 Devide-And-Conquer, 聽起來很像模組化(Modulization), 但是Functional Programming是將一個function放入另一個function的參數, 以這種方式串連出整個程式架構。目前微軟產品有F#。
  2. Dynamic Languages: 不像傳統的Static Language, 執行前先compile, 若型別有錯, 就會產生編譯錯誤, Dynamic Languages會在run time時才依據程式當時狀態決定變數型態, 例如作者舉的例子:
    animal = dock.new()
    animal = cow.new()
    animal 可以是dock物件, 也可以事後改為cow物件

    聽起來又很像早期變數不用宣告的Basic Intepreter.
  3. LINQ: Microsoft力推的物件查詢語言, 提供類似SQL的語法操作各種類型的物件, 例如Database、XML、Object等, 值得注意的是PLINQ, 它是平行運算的LINQ, 搞不好就是微軟雲端運算(Cloud Computing)的要角。

2008年4月25日 星期五

設定建置前/後事件之動作

Q: 如何在VS.net IDE中設定建置前/後事件之動作?

A: 有時候我們建置執行檔後, 希望複製執行檔製特定目錄, 以便測試或發行, 這時我們可以在VS.net IDE中設定建置前/後事件所要執行的DOS指令.

1. 打開專案屬性頁, 切換到【編譯】(Build)頁籤,點選【建置事件...】按鈕, 如下:

2. 輸入DOS指令,可利用巨集以存取專案相關目錄、檔名或其它屬性,例如下列指令將所有輸出檔複製到bin\exe目錄:

xcopy /y /s $(TargetDir)*.* $(TargetDir)..\exe

可輸入多行指令, 或使用批次檔, 撰寫複雜的邏輯。

2008年4月11日 星期五

今天看了一篇 AJAX enabled Gridview 的文章, 寫得有點簡略, 重新給它整理一下, 希望有志之士能較快速上手。

  1. asp.net網站下載 ASP.NET Ajax Extension 及 ASP.NET Ajax Control Kit, 並安裝.
  2. 新增一個 ASP.NET Ajax Enabled Web Site
  3. 將 AjaxControlToolkit.dll (Ajax Control Kit) 加入參考
  4. 加入一個 Textbox、GridView、Button
  5. 設定GridView的資料來源, 連接至資料庫, 並設參數連接至 Textbox
  6. 加入一個UpdatePanel、UpdatePanelAnimationExtender
  7. 將GridView拖入UpdatePanel
  8. 設定UpdatePanelAnimationExtender的TargetID=UpdatePanel1
  9. 設定UpdatePanel的Trigger為Button1.Click
  10. 設定UpdatePanel的UpdatePanelAnimationExtender1文字為...
  11. 在Button1.Click事件中, 撰寫程式如下:
    System.Threading.Thread.Sleep(2000)
    Me.GridView1.DataBind()

2008年4月10日 星期四

SQL指令LIKE 的用法

Q: SQL指令中的LIKE有何使用技巧?

A: LIKE 主要是搭配萬用字元, 以類似Regular Expression的方式篩選資料, 舉例如下:

  • 找出【台】開頭的公司
    Select * from Company where CompanyName like '台%'
  • 找出【台】結尾的公司
    Select * from Company where CompanyName like '%台'
  • 找出【台】開頭且只有兩個字的公司, 如台泥、台塑, 但【台石化】就不符合了
    Select * from Company where CompanyName like 台_'
  • 找出【台】開頭且第二個字為【泥】或【南】的公司, 如台泥、台南, 但【台肥】、【台鳳】就不符合了
    Select * from Company where CompanyName like 台[泥南]'
  • 找出【台】開頭且第二個字筆畫介於【泥】與【南】之間的公司, 如台泥、台肥, 但【台鳳】就不符合了
    Select * from Company where CompanyName like 台[泥-南]'
  • 反之, 要找出【台】開頭且第二個字為【泥】或【南】的公司, 只要加個^,代表否定的意思
    Select * from Company where CompanyName like 台[^泥南]'

2008年4月8日 星期二

如何將MSQL備份資料庫放上其他的Server

Q: 如何將MSQL備份資料庫放上其他的Server

A: 步驟如下
1. 登入
mysql -u root -D mysql
2. 新增一個user
INSERT INTO user (Host,User,Password) VALUES('%','user1',PASSWORD('pwd1'));
3. Create database
create database newdb
4. 指定database
use newdb
5. 執行備份後的資料庫指令 (目錄分隔"\"須以"\\"替代)
source c:\\20080409 1159.sql
6. 授權
grant all privileges on newdb.* to user1@localhost;

2008年4月7日 星期一

MySQL 初入門

1. 安裝
在Windows下安裝有兩種, 一為註冊為Windows Service, 開機自動啟動, 另一種為手手動開啟.

2. 手動開啟

  • 開啟:在安裝目錄下, double click start.bat
  • 關閉:在安裝目錄下, double click shutdown.bat

3. 輸入SQL指令

  • Connect:mysql -D {database} -u {user id} -p {password}
  • Execute SQL:select * from {table_name}

4. Backup/Restore

  • Backup:mysqldump -u root {database} [{table_name}] {output_file}
  • Restore

mysql -u root -p {password}

create database aaa

use {database_name}

source ~/{output_file}