none
請教關於 Process, AppDomain, Thread 的問題 RRS feed

  • 問題

  • 有幾個問題, 想請教一下前輩:

     

    1. 我寫了一支程式 AAA.exe, 定期會去自動下載新的版本, 因為執行中的程式沒法動, 所以我的做法是先將 AAA.exe 改為 AAA.old, 再下載新版AAA.exe, 重新開機之後, 就會以新版的AAA.exe, 正常狀況下是不會有問題, 但是偶爾會發現, 開機的時候還是啟動 AAA.old 了不知道為什麼, 是在那兒的登錄檔有登錄要去執行 AAA.old 嗎? 如果再重新開機, 又會以 AAA.exe 啟動。

     

    2. 多工處理的狀況下, 是否為 一個 Process 下可以有多個 AppDomain, 而 AppDomain 下面可以有多個 Thread, 在不同的 AppDomain下, Thread 有可能互通資料嗎?

    假設我在 SecondDomain 去記錄一個靜態(Static) 的 Thread 位址參照, 有沒有可能在 CurrentDomain 下面去控制 SecondDomain 的這個 Thread ?

     

    3. SyncLock, Monitor, Mutex 是否有跨 AppDomain 鎖住多重執行緒?

     

    4. 在產生新的 Thread 時, 偶爾會發現 Thread 有卡住不動的情況, 有時候是過了幾個小時之後, 自己又醒過來, 有時候是根本就不動, 後來才發現應該是 Thread 還沒創建完畢, 主程式就已經離開了, 所以主程式如果多寫一些 Log, 就比較不會有卡住的情況, 要避免主程式在 Thread 還沒創建完畢就離開, 有什麼方法嗎? (除了 Thread.Sleep 之外, 因為 Thread.Sleep 會延長主程式的時間, 有可能發生 Timeout 的情形)

    2007年10月5日 上午 02:13

解答

  • 英文版討論區的回覆:

     

    1) Yes. Mostly. Threads actually belong to the process, but .NET makes it look like a thread can belong to an App Domain for intents and purposes.

     

    2) There is no such thing as a static thread. Static/shared memory is shared by all threads (in an app domain). If you need to send data to another app domain, you must use Remoting, probably with an IPC channel or something similar. You could also use something like a memory mapped file through p/invoke Win32 API calls.

     

    3) Unnamed sync objects (monitors, mutexes, semephores, etc.) apply to the local app domain. Named sync objects apply to the whole operating system. If you are running Windows server or any version of Windows that is running terminal-services-based features, named sync objects can apply to the entire machine or to the specified user session depending on the name - names that start with "Global\" apply to the whole system while names that start with "Local\" apply to the user session.




    -Rob Teixeira
    2007年10月15日 上午 10:14

所有回覆

  • 你要不要考慮使用 ClickOnce 來佈署你的應用程式??

    並參考 使用 ClickOnce 部署 API 以程式設計方式檢查應用程式更新 來實作自動更新...

    2007年10月5日 上午 02:19
  • 我的程式是放在服務裏面, ClickOnce 能夠做到定期即時更新嗎?

    2007年10月5日 上午 03:16
  • 可以利用程式定期更新,但是要重新執行才會跑新版本的程式。

     

    2007年10月5日 上午 05:27
  • 印象中 ClickOnce 好像只能用在應用程式, 因為服務必須要另外再註冊MMC,

    而且ClickOnce 安裝完畢之後會立即執行 Application.Run() 啟動應用程式,

    服務不像應用程式可以直接執行, 安裝完畢之後就會跳出錯誤視窗,

    系統會視同安裝錯誤, 自己就進行反安裝, 結果等於沒裝,

    所以好像無法用 ClickOnce ! 

     

    2007年10月5日 上午 05:41
  • 英文版討論區的回覆:

     

    1) Yes. Mostly. Threads actually belong to the process, but .NET makes it look like a thread can belong to an App Domain for intents and purposes.

     

    2) There is no such thing as a static thread. Static/shared memory is shared by all threads (in an app domain). If you need to send data to another app domain, you must use Remoting, probably with an IPC channel or something similar. You could also use something like a memory mapped file through p/invoke Win32 API calls.

     

    3) Unnamed sync objects (monitors, mutexes, semephores, etc.) apply to the local app domain. Named sync objects apply to the whole operating system. If you are running Windows server or any version of Windows that is running terminal-services-based features, named sync objects can apply to the entire machine or to the specified user session depending on the name - names that start with "Global\" apply to the whole system while names that start with "Local\" apply to the user session.




    -Rob Teixeira
    2007年10月15日 上午 10:14