none
表單程式為啥不能使用WaitAll RRS feed

  • 問題

  • 如果要使用WaitAll()必需要在MTA模式下,

    1.是否表單程式只能是STA?

    2.如果(1)為YES,想請問為什麼阿? 他跟主控台程式有啥主要差別?

    3.如果(1)為NO,我該如何改變模式?

    2010年5月28日 上午 06:33

解答

  • 我剛剛想起原因了, 在Visual Basic下, 你必需要修改Sub main

    原來在方案屬性的起始物件會預設為某個Form (ex: Form1)

    要先取消 "啟用應用程式架構", 然後將啟始物件設為Sub Main

    下一個步驟是新增一個模組, 在模組中寫入Sub main的程式

    ex:

    Module Module1
        <MTAThreadAttribute()> Sub main()
            Application.Run(Form1)

        End Sub
    End Module


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    • 已標示為解答 小見光二 2010年5月28日 上午 11:53
    2010年5月28日 上午 08:13
    版主

所有回覆

  • 可以把你的問題程式碼貼上來嗎 ? 我在多緒的狀態下使用WaitAll是正常的.
    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月28日 上午 07:54
    版主
  • 我剛剛想起原因了, 在Visual Basic下, 你必需要修改Sub main

    原來在方案屬性的起始物件會預設為某個Form (ex: Form1)

    要先取消 "啟用應用程式架構", 然後將啟始物件設為Sub Main

    下一個步驟是新增一個模組, 在模組中寫入Sub main的程式

    ex:

    Module Module1
        <MTAThreadAttribute()> Sub main()
            Application.Run(Form1)

        End Sub
    End Module


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    • 已標示為解答 小見光二 2010年5月28日 上午 11:53
    2010年5月28日 上午 08:13
    版主
  • 感謝Bill大大,原先問題已經解決了。

    但是我想要瞭解些觀念,希望大家在繼續指點小弟

    1.應用(表單)程式原先預設為STA,那麼現在改成MTA,是否會有啥風險存在? 或者限制了那些東西?

    2."啟用應用程式架構"主要設定為何? 取消後會喪失啥?

    3.除了要MTA外,還有什麼情況下會使用模組方式開起應用程式,可以舉些例子嗎?

     

    謝謝 *.*

    2010年5月28日 上午 08:53
  • 1. 有什麼風險, 目前沒遇到. 不過MSDN中有一個地方在說明 Thread Apartment, 你可以看看

    http://msdn.microsoft.com/en-us/library/ms693344%28VS.85%29.aspx

    2. 啟用應用程式架構其實應該是Visual Studio 為VB.NET開發者設立的一個方便之路, 如果你試著新增一個C# 的Windows 應用程式專案, 你會發現它的啟始點預設會在 Program.cs , 裡面的程式內容就類似我上面所寫的.

    ex:

    namespace Comboboxest1
    {
        static class Program
        {
            /// <summary>
            /// 應用程式的主要進入點。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }
    }

    3. 至於何時會用到,  就是要自訂一些程式在表單啟動之前的程式時比較容易用的到. 或是你在啟動程式要傳參數進去的時候.

    ex:

    <MTAThreadAttribute()> Sub main(ByVal cmdArgs() As String)
            If cmdArgs.Length > 0 Then
                If CType(cmdArgs(0), Integer) > 100 Then
                    Application.Run(Form1)
                Else
                    Application.Exit()
                End If
            End If

        End Sub

    如果啟動時有帶一個參數 且大於100, 就會開啟表單, 小於或等於100則否, 這只是一個很簡單的例子. 怎麼應用要靠你自己想像

    以下有一些文件你可以看看

    http://msdn.microsoft.com/zh-tw/library/3cf7t4xt%28VS.80%29.aspx

    http://msdn.microsoft.com/zh-tw/library/17k74w0c%28VS.90%29.aspx

    http://msdn.microsoft.com/zh-tw/library/754w18dd%28VS.90%29.aspx


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月28日 上午 10:06
    版主