質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

5131閲覧

スレッドからアプリケーションを再起動させたい

takagi.1994

総合スコア47

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2015/12/21 14:53

public partial class Form1 : Form
{
private static System.Threading.Mutex mutex = new System.Threading.Mutex(false, "hoge");

public Form1() { new Class1(); } public static void reboot() { mutex.ReleaseMutex(); Application.Restart(); }

}

class Class1
{
public Class1()
{
main();
}

private async void main() { await Task.Run(() => { try { // 処理 } catch (Exception ex) { Form1.reboot(); } }); }

}

上記の様な場合、スレッドで例外が発生したとき再起動させたいのですが、どうするのがよいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tak1wa

2015/12/21 15:20

なぜメインスレッド以外から再起動を行うのでしょうか。理由を教えてください。
takagi.1994

2015/12/21 15:51

バックグラウンドにてHttpWebRequestにてデータを取ってきて処理をしているのですが、何かしらの例外が発生した場合に再起動を行いたいのです。
guest

回答2

0

ベストアンサー

こんにちは。

ミューテックスをスレッド所有にしたうえで、バックグラウンドスレッドで発生した例外はメインスレッドで処理すれば良いかなと思います。

C#

1public partial class Form1 : Form 2{ 3 //private static System.Threading.Mutex mutex = new System.Threading.Mutex(false, "hoge"); 4 private static System.Threading.Mutex mutex = new System.Threading.Mutex(true, "hoge"); 5 6 public Form1() 7 { 8 new Class1(); 9 } 10 11 public static void reboot() 12 { 13 mutex.ReleaseMutex(); 14 Application.Restart(); 15 } 16} 17 18class Class1 19{ 20 public Class1() 21 { 22 main(); 23 } 24 25 private async void main() 26 { 27 try 28 { 29 await Task.Run(() => 30 { 31 System.Threading.Thread.Sleep(3000); 32 throw new ApplicationException(); 33 }); 34 } 35 catch 36 { 37 Form1.reboot(); 38 } 39 } 40}

投稿2015/12/21 16:21

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takagi.1994

2015/12/21 16:35

早速のご返事ありがとうございます。 試してみたいと思います。
takagi.1994

2015/12/21 16:53

オブジェクト同期メソッドは、コードの非同期ブロックから呼び出されました。 となってしまうのはなぜでしょうか?
Tak1wa

2015/12/22 00:17

私のほうでは発生しないので質問者さんのコードに問題があるか、環境に差があるかのどちらかです。私が提示したコードで発生するのですか?
takagi.1994

2015/12/24 18:10

新たに別プロジェクトを作成して、コピペすると動きました。 既存ものに手を加えると例外が発生してしまうので、別のところに問題があると思いますので、まずは別の問題を解決するかそもそもを考えなおすほうがよいかと考えています。 今回の回答には非常に勉強になりました。ありがとうございました。
guest

0

こんにちは。

Tak1waさんとのやり取りから、恐らく下記ではないかと思います。

Application.Restart()はメイン・スレッドで実行する必要があるが、class1はサブスレッドにてコンストラクトされており、Application.Restart()がサブスレッドから呼び出されている。

これを前提に回答してみます。

サブスレッドからメインスレッドへ処理を依頼する必要があります。
このようなケースでは、別スレッドからフォーム、コントロールを扱うの手順を使えばできる筈です。
下記イメージで良いと思うのですが、ビルドしてないし、C#は久しぶりなのでミスがあったらごめんなさい。

C#

1class Class1 2{ 3 Form1 mForm1; 4 public Class1(Form1 iForm) 5 { 6 mForm1=iForm; 7 main(); 8 } 9 10 //Delegate を宣言しておく 11 delegate void RebootDelegate(); 12 13 //rebootを呼び出すメソッド 14 internal void CallReboot() { 15 Form1.reboot(); 16 } 17 18 private async void main() 19 { 20 await Task.Run(() => 21 { 22 try 23 { 24 // 処理 25 } 26 catch (Exception ex) 27 { 28 //スレッド内からデリゲートを介して以下のようにして呼ぶ 29 mForm1.Invoke(new RebootDelegate(CallReboot)); 30 } 31 }); 32 } 33}

投稿2015/12/22 01:37

編集2015/12/22 04:17
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takagi.1994

2015/12/24 18:13

ご回答ありがとうございました。 非常に勉強になりました。 スレッドから戻り値を返すような形にかえてメインスレッドでその戻り値によって次の処理をどうするかというような仕様に変更したほうがいいのかなと思うようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問