スレッドがバックグラウンドで動作しているときにロード画面をアニメーション化しようとしていますが、うまくいきません。
Button.Dispatcher を呼び出すバックグラウンド ワーカーと関係があることに気付きましたが、スレッド エラーが発生するため削除できません。これを修正するにはどうすればよいですか?
以下は私のコードです:
private void btnLogin_Click(object sender, RoutedEventArgs e)
{
Storyboard sb = (Storyboard)FindResource("Loading");
sb.Dispatcher.BeginInvoke(new Action(() => sb.Begin()), DispatcherPriority.Normal, null);
BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += new DoWorkEventHandler(bg_DoWork);
bg.RunWorkerAsync();
}
private void bg_DoWork(object sender, DoWorkEventArgs e)
{
System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(RunThread));
thread.Start();
}
private void RunThread()
{
btnLogin.Dispatcher.BeginInvoke(new Action(() => TheBackgroundWork()), DispatcherPriority.Normal, null);
}
アップデート:
Jay の提案に従って、Do_Worker から UI 呼び出しを削除します。残念ながら、私はまだエラーが発生しています:
The calling thread cannot access this object because a different thread owns it.
Webサービスクライアントによってスローされました
以下は更新されたコードです。
private WebServiceClient proxy = new WebServiceClient();
private void btnLogin_Click(object sender, RoutedEventArgs e)
{
sb = (Storyboard)FindResource("sbLoading");
sb.Dispatcher.BeginInvoke(new Action(() => sb.Begin()), DispatcherPriority.Normal, null);
BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += new DoWorkEventHandler(bg_DoWork);
bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted);
bg.RunWorkerAsync();
}
private void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
var u = e.Result;
if (u != null)
//pass the data
}
private void bg_DoWork(object sender, DoWorkEventArgs e)
{
try
{
var u = proxy.ToWebService(x,y); //this guy throws an error
e.Result = u;
}
catch
{
this.Dispatcher.Invoke(new Action(
() => MessageBox.Show("Connection Error", this.Title)),
DispatcherPriority.Normal, null);
}
}