Fromアプリにボタンを追加しました。ボタンを押すとpublic async void privateasynctest内の変数taskにLedSwitchTaskメソッドの戻り値が返ってきます。LedSwitchTaskのTask.Runは非同期で走らせたいのですが、Task.Runの部分に.ConfigureAwait(false)を追加した場合と、そうでない場合は、非同期の効果に
関係するでしょうか? ちなみにLedSwitchTaskは、ハードウェアに信号を一度送るだけと想定しています。
このConfigureAwaitのないものでも、特に問題はないでしょうか? なぜこのようなことが気になるかと
いいますと、intellitestで非同期の宣言はasync taskを使用しないと、機能できず走らせるには、
ConfigureAwaitを使用しないとデッドロックすることがあるらしいからです。
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; using System.Drawing; namespace PrivateAccess { 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 { //Formを継承させると、無限LOOPになる // public class PrivateAccess { //Formを継承させなければ、正常にresが返る /// <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); string task = await (Task<string>)dynMethod.Invoke(theObject, new string[] { "1 0" }); var s = task; } 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"; })); // })).ConfigureAwait(false); return res; } } }コード
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/25 09:05