メッセージボックスクラスを1つに作成しようとしていますが、ボタンを押すのを待つメッセージボックスと同じ方法で動作させたいそれ以降のコードを実行するよりも。私は2つの方法UIスレッドをブロックせずにスレッドが終了するのを待ちます
2つのスレッド
public void TestClick()
{
Thread thread1 = new Thread(TestMethod);
thread1.Start();
thread1.Join();
Debug.Log("Done");
}
private void TestMethod()
{
float time = 0;
while (time <= 20)
{
Thread.Sleep(100);
time++;
Debug.Log("Im doing heavy work");
}
}
この1つのブロックメインスレッドに参加してTestMethod
が完了した後にのみ再開されますが、私ドンでそれを再作成しようとした
var mbox = MessageBox.Show("Test", "test", MessageBoxButtons.YesNo);
var test = mbox == DialogResult.Cancel; <- it will wait here
ユーザーがその時間中にメッセージボックスとやりとりすることができないため、それが必要です。
非同期アプローチ
public delegate int AsyncTask();
public void TestClick()
{
RunAsyncAndWait();
Debug.Log("Done");
}
public int Method1()
{
float time = 0;
while (time <= 20)
{
Thread.Sleep(100);
time++;
Debug.Log("Im doing heavy work");
}
return 0;
}
public void RunAsyncAndWait()
{
AsyncTask ac1 = Method1;
WaitHandle[] waits = new WaitHandle[1];
IAsyncResult r1 = ac1.BeginInvoke(null, null);
waits[0] = r1.AsyncWaitHandle;
WaitHandle.WaitAll(waits);
}
これはまさに最初のもののように動作しますが、我々はWaitHandle[] waits = new WaitHandle[2];
へWaitHandle[]
の大きさのようないくつかのものを変更した場合、それは不気味に動作します。
これは、以前の方法のように一度に21個のメッセージを投稿するのではなく、コンソールに何かを連続的に書き込むので、これはもっとうまく動作します。プログラムがうまく動作します)、それはコンソールで何かを印刷の上に保持し、私はこのエラーを取得
例外ArgumentNullException:NULLハンドル パラメータ名:waitHandles System.Threading.WaitHandle.CheckArray(System.Threading.WaitHandle [ ]ハンドル、ブールwaitAll)(/Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Threading/WaitHandle.cs:77) System.Threading .WaitHandle.WaitAll(System.Threading.WaitHandle [] waitHandles)(/Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Threading/WaitHandle.cs:109) Assets.Scripts.Test。 RunAsyncAndWait()(Assets/Scripts/Test.cs:40) Assets.Scripts.Test.TestClick()(Assets/Scripts/Test.cs:16) UnityEngine.Events.InvokableCall.Invoke(System.Object [ ] args)(C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:153) UnityEngine.Events.InvokableCallList.Invoke(System.Object [] parameters)(C:/ buildslave/unity/buildにあります) /Runtime/Export/UnityEvent.cs:630) UnityEngine.Events.UnityEventBase.Invoke(System.Object [] parameters)(C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:765) UnityEngine .Events.UnityEvent.Invoke()(C:/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs:53)(C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:35) UnityEngine.UI.Button.OnPointerClick(UnityEngine。 (IPointerClickHandlerハンドラ、UnityEngine.EventSystems)。(EventSystems.PointerEventData eventData)(C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:44) UnityEngine.EventSystems.ExecuteEvents.Execute BaseEventData eventData)(C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:52) UnityEngine.EventSystems.ExecuteEvents.Execute [IPointerClickHandler](UnityEngine.GameObjectターゲット、UnityEngine.EventSystems .BaseEventData eventData、UnityEngine.EventSystems.EventFunction`1 functor)(C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:269) UnityEngine.EventSystems。EventSystem:私はすぐにちょうど
IAsyncResult r1 = ac1.BeginInvoke(ar => Debug.Log("Done"), null);
をそれをテストしかし、運の何も変わっていないとのために何かを追加しましたので、私はここでコールバック関数が必要になることがありますように更新()
最初の行は、私には思えました。
どのように私は全体として(メッセージボックスを作る、ボタンが押されるまでスレッドをブロックする)この問題に近づくことができますか?
またはMicrosoftがこれをどのように実装しているかについての情報... _ [ここにソースがあります](http://www.dotnetframework.org/default.aspx/4.0/[email protected]/DEVDIV_TFS/Dev10/Releases)/RTMRel/wpf/src/Framework/System/Windows/MessageBox @ cs/1305600/MessageBox @ cs)を使用してください。 – txtechhelp
メッセージボックスにスレッドをブロックするかブロックしないようにしますか? – CodingYoshi