私は、プログラムでキーワードによるYoutube検索を行い、これを行うにはYoutube APIを使用しています。検索の進行が完了したときにイベントを発生させ、YoutubeSearchCompletedEventArgs
の結果をYoutubeSearchCompleted
で返します。イベントの制御テキストの更新で不正なクロススレッド例外がスローされる
しかし、のコードでは、Form.cs
がクロススレッド違法操作例外をスローします。通常、AsyncOperation.Post
メソッドを使用すると、InvalidOperationException
を投げてはなりません。以前はダウンロードマネージャプロジェクトで同じ方法を使用していたので、うまくいきました。だから私はなぜこれが起こるのか理解できません。このコードで
YouTube検索クラス
class YouTubeManager
{
public delegate void YoutubeSearchCompletedEventHandler(object sender, YoutubeSearchCompletedEventArgs e);
public event YoutubeSearchCompletedEventHandler YoutubeSearchCompleted;
AsyncOperation aop = AsyncOperationManager.CreateOperation(null);
List<YoutubeVideo> SearchByKeyword(string keyword)
{
List<YoutubeVideo> videos = new List<YoutubeVideo>();
//.......
//...Youtube data api search codes....
//.......
return videos;
}
public void Search(string keyword)
{
Task.Run(() =>
{
List<YoutubeVideo> list = SearchByKeyword(keyword);
aop.Post(new System.Threading.SendOrPostCallback(delegate
{
if (YoutubeSearchCompleted != null)
YoutubeSearchCompleted(this,
new YoutubeSearchCompletedEventArgs(keyword, list);
}), null);
});
}
}
Form.cs
public partial class Form1 : Form
{
YouTubeManager yam = new YouTubeManager();
public Form1()
{
InitializeComponent();
this.Load += Form1_Load;
}
void Form1_Load(object sender, EventArgs e)
{
yam.YoutubeSearchCompleted += yam_YoutubeSearchCompleted;
yam.Search("Blues");
}
void yam_YoutubeSearchCompleted(object sender, YoutubeSearchCompletedEventArgs e)
{
if (e.Videos.Count < 1) return;
textBox1.Text = e.Videos[0].Title();
}
}
textBox1.Text = e.Videos[0].Title();
ラインはInvalidOperationException
をスロー。この問題を解決するにはどうすればよいですか?
注:私はInvoke
メソッドを望んでいません。ちょうどAsyncOperation
です。
解決策は問題なく動作します。手伝ってくれてありがとう。 –