周期性任务中出现无效的跨线程访问异常
本文关键字:线程 访问 异常 无效 任务 周期性 | 更新日期: 2023-09-27 18:20:05
我正试图使用定期任务代理在shell tile上显示我的顶部tweet。互动程序必须每30分钟更新一次。我使用任务并行库是为了它是连续的。问题是我得到了一个"INVALID CROSS THREAD ACCESS"异常。
这是我的日程任务代理代码:
protected override void OnInvoke(ScheduledTask task)
{
ShellToast popupMessage = new ShellToast()
{
Title = "My First Agent",
Content = "Background Task Launched",
};
popupMessage.Show();
UpdateTile().ContinueWith(x => NotifyComplete());
}
private Task<bool> UpdateTile()
{
var tcs = new TaskCompletionSource<bool>(TaskCreationOptions.AttachedToParent);
WebClient twitter = new WebClient();
twitter.DownloadStringCompleted += (sender, e) =>
{
if (e.Error != null)
{
tcs.TrySetResult(true);
}
else
{
XElement xmlTweets = XElement.Parse(e.Result);
var message2 = xmlTweets.Descendants("status")
.Select(x => x.Element("text").Value).FirstOrDefault();
ShellTile appTile = ShellTile.ActiveTiles.First();
if (appTile != null)
{
StandardTileData tileData = new StandardTileData
{
BackContent = DateTime.Now.ToString() + message2.ToString()
};
appTile.Update(tileData);
tcs.TrySetResult(true);
}
else
{
tcs.TrySetResult(true);
}
}
};
twitter.DownloadStringAsync(new Uri("http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=dnivra26"));
return tcs.Task;
}
这是抛出异常的行:
var tcs = new TaskCompletionSource<bool>(TaskCreationOptions.AttachedToParent);
//这是我和所做的改变
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
ShellTile appTile = ShellTile.ActiveTiles.First();
if (appTile != null)
{
StandardTileData tileData = new StandardTileData
{
BackContent = DateTime.Now.ToString() + message2.ToString()
};
appTile.Update(tileData);
tcs.TrySetResult(true);
}
else
{
tcs.TrySetResult(true);
}
});
这是显示异常的行:
var tcs = new TaskCompletionSource<bool>(TaskCreationOptions.AttachedToParent);
由于工作是在后台线程上完成的,因此无法在同一线程上更新UI。相反,在更新UI的部分使用Deployment.Current.Dispatcher.BeginInvoke()
。
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
ShellTile appTile = ShellTile.ActiveTiles.First();
if (appTile != null)
{
StandardTileData tileData = new StandardTileData
{
BackContent = DateTime.Now.ToString() + message2.ToString()
};
appTile.Update(tileData);
tcs.TrySetResult(true);
}
else
{
tcs.TrySetResult(true);
}
}