フォームアプリで、ボタンクリックから呼び出した場合は、デッドロックしません。コンソールアプリでForm継承して
呼び出すと、voidなので戻り値がないのですがデッドロックしてしまいます。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.Windows.Forms; using System.Reflection; namespace PrivateAccess { //コンソールアプリの場合 最下段の(1)のブレークポイントが無視され、止まらない class Program { static void Main(string[] args) { PrivateAccess pr = new PrivateAccess(); pr.privateasynctest(); Console.WriteLine("status: Ok"); for (long i = 0; i < 100000; i++) { for (long j = 0; j < 100000; j++) { } } } } //フォームアプリケーションの場合 フォーム内のボタンを押下して 最下段の(1)のブレークポイントで止めることができる //public partial class Form1 : Form //{ // public Form1() // { // InitializeComponent(); // } // private void button1_Click(object sender, EventArgs e) // { // PrivateAccess pr = new PrivateAccess(); // pr.privateasynctest(); // } //} public class PrivateAccess :Form { /// <summary> public PrivateAccess() { } public async void privateasynctest() { try { PrivateAccess theObject = new PrivateAccess(); Type t = theObject.GetType(); MethodInfo dynMethod = t.GetMethod("LedSwitchTask", BindingFlags.NonPublic | BindingFlags.Instance); var task = await (Task<string>)dynMethod.Invoke(theObject, new string[] { "1 0" }); } catch (Exception ex) { string s; s = ex.Message; } } private async Task<string> LedSwitchTask(string allArg) { string res; res = await Task.Run(new Func<string>(() => { string chan; chan = allArg.Substring(0, 1); Thread.Sleep(800); return "OK"; })); return res; // (1) } } }
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/29 03:49 編集
2017/06/29 04:10 編集
2017/06/29 05:02
2017/06/29 05:12
2017/06/29 08:33
2017/06/29 23:46
2017/06/29 23:59
2017/06/30 00:09