C# UWP错误(RPC_E_错误_线程)
这个错误可能已经出现过很多次了,并且通过对代码进行一些更改以在UI线程而不是工作线程上运行特定的代码来避免。但在我的情况下,情况就不同了 问题: 在我的应用程序中,我无法实现C# UWP错误(RPC_E_错误_线程),c#,multithreading,uwp,C#,Multithreading,Uwp,这个错误可能已经出现过很多次了,并且通过对代码进行一些更改以在UI线程而不是工作线程上运行特定的代码来避免。但在我的情况下,情况就不同了 问题: 在我的应用程序中,我无法实现增量加载,因为我尝试过,但每次都会失败,并且没有得到任何结果。所以我决定对GridViewscroll做同样的事情,所以我在GridView中获得了ScrollView,然后我将其与ViewChnaged绑定,当滚动结束时,我调用我的函数从互联网加载更多项目 大多数情况下,一切正常,但随后出现以下例外情况 应用程序调用了为不
增量加载
,因为我尝试过,但每次都会失败,并且没有得到任何结果。所以我决定对GridView
scroll做同样的事情,所以我在GridView
中获得了ScrollView
,然后我将其与ViewChnaged
绑定,当滚动结束时,我调用我的函数从互联网加载更多项目
大多数情况下,一切正常,但随后出现以下例外情况
应用程序调用了为不同线程封送的接口。(来自HRESULT的异常:0x8001010E(RPC_E_错误_线程))
我知道当UI元素从非UI线程(或者我还不知道的其他东西)更新时,会出现这种异常,但在过去,我可以通过专门从UI线程调用代码来避免这种情况。现在这样做也不起作用,因为不管我是从UI线程调用代码还是从工作线程调用代码,它都可以工作,有时它会发出异常
这是我得到的StackTrace
,异常的来源是“Windows”
,但我不知道关于它的任何信息,也不知道它如何帮助我:
at Windows.UI.Xaml.Controls.TextBlock..ctor()
at WatchfreeWebsite.MoviesPage.<>c__DisplayClass27_0.<<LoadHtmlDocument>b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at WatchfreeWebsite.MoviesPage.<GridViewScroll_ViewChanged>d__21.MoveNext()
我的第2页:(电视节目页)
public TVShowsPage()
{
初始化组件();
NavigationCacheMode=NavigationCacheMode.Enabled;
this.Loaded+=TVShowsPage\u Loaded;
LoadHtmlDocument();
TVShowsList=新的ObservableCollection();
}
已加载私有void TVShowsPage_(对象发送方,路由目标)
{
sv=ViewHelper.FindVisualTreeObject(dataGrid).OfType().First();
sv.ViewChanged+=TVGridScroll\u ViewChanged;
}
私有异步void TVGridScroll_ViewChanged(对象发送方,ScrollViewServiceChangedEventArgs e)
{
var currentScroll=垂直偏移量;
var maxScroll=sv.ScrollableHeight;
如果(currentScroll==maxScroll)
{
var pBar=newprogressbar();
pBar.IsIndeterminate=真;
dataGrid.Footer=pBar;
//到达终点
尝试
{
等待加载HtmlDocument();
}
捕获(例外情况除外)
{
ErrorDialog(“加载数据时发生错误\n错误为:“+ex.HResult+”\n消息:“+ex.Message”);
}
}
}
私有任务加载HtmlDocument()
{
尝试
{
字符串url=“”;
返回任务。运行(异步()=>
{
如果(首次运行)
{
url=TVShowsBaseLink;
currentPageLink=TVShowsBaseLink;
等待Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
//#pragma警告禁用
lv.showsync();
//#pragma警告恢复
});
}
其他的
{
url=等待GetNextPageLink();
currentPageLink=url;
如果(url==“”| | url==null)
{
dataGrid.Footer=new TextBlock().Text=“未找到更多项。”;
lv.Hide();
返回;
}
}
var doc=新的HtmlDocument();
if(NetworkAvailable())
{
doc=等待新的HtmlWeb().LoadFromWebAsync(url);
}
其他的
{
doc=null;
lv.Hide();
返回;
}
如果(doc!=null)
{
链接(doc);
}
});
}
捕获(例外情况除外)
{
ErrorDialog(“下载网页时出错”+ex.Message);
返回null;
}
}
专用异步无效标题(HtmlDocument文档)
{
尝试
{
foreach(doc.DocumentNode.subjects(“a”)中的var链接,其中(t=>t.Attributes.Contains(“title”))
{
if(link!=null&&link.InnerText!=“WatchFree.to”&&link.InnerText!=“电影”&&link.InnerText!=“电视节目”)
{
字符串x=link.GetAttributeValue(“title”,null);
x=x.替换(“手表存放柜”);
x=x.Trim();
x=newregex(@“(\(\d{4}\)(?:\s*\1)+”)。替换(x,“$1”)。Trim();
TVShowsTitles[numberOfTitles]=x;
numberOfTitles++;
如果(numberOfTitles==numberOfLinks)
{
打破
}
}
}
等待Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
TVShowsList=ItemManager.GetTVShowsCollection(lastListItems,numberOfLinks,type);
Bindings.Update();
lv.Hide();
TextBlock a=新的TextBlock();
a、 水平对齐=水平对齐.居中;
dataGrid.Header=a.Text=“电视节目”;
});
lastListItems=numberOfLinks;
firstRun=false;
}
捕获(例外情况除外)
{
ErrorDialog(“获取电影标题时出现问题。\n”+ex.Message);
}
}
私有无效图像链接(HtmlDocument文档)
public MoviesPage()
{
InitializeComponent();
NavigationCacheMode = NavigationCacheMode.Enabled;
LoadHtmlDocument();
MoviesList = new ObservableCollection<ItemsClass>();
this.Loaded += MoviesPage_Loaded;
}
private void MoviesPage_Loaded(object sender, RoutedEventArgs e)
{
sv = ViewHelper.FindVisualTreeObject(dataGrid).OfType<ScrollViewer>().First();
sv.ViewChanged += GridViewScroll_ViewChanged;
}
private async void GridViewScroll_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
var currentScroll = sv.VerticalOffset;
var maxScroll = sv.ScrollableHeight;
if (currentScroll == maxScroll)
{
var pBar = new ProgressBar();
pBar.IsIndeterminate = true;
dataGrid.Footer = pBar;
// end reached
try
{
await LoadHtmlDocument();
}
catch (Exception ex)
{
ErrorDialog("Something happened while loading data\nThe Error is: " + ex.HResult + "\nMessage: " + ex.Message);
}
}
}
public Task LoadHtmlDocument()
{
try
{
string url = "";
return Task.Run(async () =>
{
if (firstRun) // first page
{
url = MoviesBaseLink;
currentPageLink = MoviesBaseLink;
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
//#pragma warning disable
lv.ShowAsync();
//#pragma warning restore
});
}
else
{
url = await GetNextPageLink();
currentPageLink = url;
if (url == "" || url == null)
{
TextBlock a = new TextBlock();
a.Text = "No more items found.";
dataGrid.Footer = a.HorizontalAlignment = HorizontalAlignment.Center;
lv.Hide();
return;
}
}
var doc = new HtmlDocument();
if (NetworkAvailable())
{
doc = await new HtmlWeb().LoadFromWebAsync(url);
}
else
{
doc = null;
lv.Hide();
return;
}
if (doc != null)
{
Links(doc);
}
});
}
catch (Exception ex)
{
ErrorDialog("MoviesDoc_Download_Failed" + ex.Message);
return null;
}
}
private void Links(HtmlDocument doc)
{
try
{
listItems = 0;
foreach (var link in doc.DocumentNode.Descendants("a").Where(pl => pl.Attributes.Contains("href")))
{
string dataValue = link.GetAttributeValue("href", "");
if (dataValue.StartsWith("/watch") && dataValue.EndsWith(".html"))
{
MoviesPageLinks[numberOfLinks] = MoviesBaseLink + dataValue.Trim();
listItems++;
numberOfLinks++;
}
if (numberOfLinks > 9999)
{
break;
}
}
ImageLinks(doc);
}
catch (Exception ex)
{
ErrorDialog("There was a problem while acquiring search links.\n" + ex.Message);
}
}
private void ImageLinks(HtmlDocument doc)
{
try
{
foreach (var link in doc.DocumentNode.Descendants("img").Where(d => d.Attributes.Contains("src")))
{
if (link != null)
{
if (link.Attributes["src"].Value == "/images/noposter.jpg")
{
MoviesImageLinks[numberOfImages] = @"ms-appx:///Assets/noposter.jpg";
}
else
{
MoviesImageLinks[numberOfImages] = string.Format("http:{0}", link.Attributes["src"].Value);
}
numberOfImages++;
}
if (numberOfImages == numberOfLinks)
{
break;
}
}
Titles(doc);
}
catch (Exception ex)
{
ErrorDialog("There was a problem in Image links.\n" + ex.Message);
}
}
private async void Titles(HtmlDocument doc)
{
try
{
foreach (var link in doc.DocumentNode.Descendants("a").Where(t => t.Attributes.Contains("title")))
{
if (link != null && link.InnerText != "WatchFree.to" && link.InnerText != "Movies" && link.InnerText != "TV Shows")
{
string x = link.GetAttributeValue("title", null);
x = x.Replace("Watch Putlocker", "");
x = x.Trim();
x = new Regex(@"(\(\d{4}\))(?:\s*\1)+").Replace(x, "$1").Trim();
MoviesTitles[numberOfTitles] = x;
numberOfTitles++;
if (numberOfTitles == numberOfLinks)
{
break;
}
}
}
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
MoviesList = ItemManager.GetMovieCollection(lastListItems, numberOfLinks, type);
this.Bindings.Update();
dataGrid.Footer = null;
TextBlock b = new TextBlock();
b.HorizontalAlignment = HorizontalAlignment.Center;
dataGrid.Header = b.Text = "Recent Movies";
lv.Hide();
});
lastListItems = numberOfLinks;
firstRun = false;
}
catch (Exception ex)
{
ErrorDialog("There was a problem while acquiring movie titles.\n" + ex.Message);
}
}
private async Task<string> GetNextPageLink()
{
string lastLink = "";
string nextPageLink = "";
var doc = await new HtmlWeb().LoadFromWebAsync(currentPageLink);
foreach (var link in doc.DocumentNode.Descendants("a").Where(t => t.Attributes.Contains("href")))
{
string value = link.GetAttributeValue("href", "");
if (value.Contains("/?page=" + nextPage))
{
nextPageLink = value;
lastLink = value;
break;
}
}
//--------------------------------------
if (nextPageLink != "" && nextPageLink == lastLink)
{
nextPageLink = MoviesBaseLink + lastLink;
nextPage++;
}
return nextPageLink;
}
public TVShowsPage()
{
InitializeComponent();
NavigationCacheMode = NavigationCacheMode.Enabled;
this.Loaded += TVShowsPage_Loaded;
LoadHtmlDocument();
TVShowsList = new ObservableCollection<ItemsClass>();
}
private void TVShowsPage_Loaded(object sender, RoutedEventArgs e)
{
sv = ViewHelper.FindVisualTreeObject(dataGrid).OfType<ScrollViewer>().First();
sv.ViewChanged += TVGridScroll_ViewChanged;
}
private async void TVGridScroll_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
var currentScroll = sv.VerticalOffset;
var maxScroll = sv.ScrollableHeight;
if (currentScroll == maxScroll)
{
var pBar = new ProgressBar();
pBar.IsIndeterminate = true;
dataGrid.Footer = pBar;
// end reached
try
{
await LoadHtmlDocument();
}
catch (Exception ex)
{
ErrorDialog("Something happened while loading data\nThe Error is: " + ex.HResult + "\nMessage: " + ex.Message);
}
}
}
private Task LoadHtmlDocument()
{
try
{
string url = "";
return Task.Run(async () =>
{
if (firstRun)
{
url = TVShowsBaseLink;
currentPageLink = TVShowsBaseLink;
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
//#pragma warning disable
lv.ShowAsync();
//#pragma warning restore
});
}
else
{
url = await GetNextPageLink();
currentPageLink = url;
if (url == "" || url == null)
{
dataGrid.Footer = new TextBlock().Text = "No more items found.";
lv.Hide();
return;
}
}
var doc = new HtmlDocument();
if (NetworkAvailable())
{
doc = await new HtmlWeb().LoadFromWebAsync(url);
}
else
{
doc = null;
lv.Hide();
return;
}
if (doc != null)
{
Links(doc);
}
});
}
catch (Exception ex)
{
ErrorDialog("Error_Downloading_WebPage\n" + ex.Message);
return null;
}
}
private async void Titles(HtmlDocument doc)
{
try
{
foreach (var link in doc.DocumentNode.Descendants("a").Where(t => t.Attributes.Contains("title")))
{
if (link != null && link.InnerText != "WatchFree.to" && link.InnerText != "Movies" && link.InnerText != "TV Shows")
{
string x = link.GetAttributeValue("title", null);
x = x.Replace("Watch Putlocker", "");
x = x.Trim();
x = new Regex(@"(\(\d{4}\))(?:\s*\1)+").Replace(x, "$1").Trim();
TVShowsTitles[numberOfTitles] = x;
numberOfTitles++;
if (numberOfTitles == numberOfLinks)
{
break;
}
}
}
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
TVShowsList = ItemManager.GetTVShowsCollection(lastListItems, numberOfLinks, type);
Bindings.Update();
lv.Hide();
TextBlock a = new TextBlock();
a.HorizontalAlignment = HorizontalAlignment.Center;
dataGrid.Header = a.Text = "TV Shows";
});
lastListItems = numberOfLinks;
firstRun = false;
}
catch (Exception ex)
{
ErrorDialog("There was a problem while acquiring movie titles.\n" + ex.Message);
}
}
private void ImageLinks(HtmlDocument doc)
{
try
{
foreach (var link in doc.DocumentNode.Descendants("img").Where(d => d.Attributes.Contains("src")))
{
if (link != null)
{
if (link.Attributes["src"].Value == "/images/noposter.jpg")
{
TVShowsImageLinks[numberOfImages] = @"ms-appx:///Assets/noposter.jpg";
}
else
{
TVShowsImageLinks[numberOfImages] = string.Format("http:{0}", link.Attributes["src"].Value);
}
numberOfImages++;
}
if (numberOfImages == numberOfLinks)
{
break;
}
}
Titles(doc);
}
catch (Exception ex)
{
ErrorDialog("There was a problem in Image links.\n" + ex.Message);
}
}
private void Links(HtmlDocument doc)
{
try
{
listItems = 0;
foreach (var link in doc.DocumentNode.Descendants("a").Where(pl => pl.Attributes.Contains("href")))
{
string dataValue = link.GetAttributeValue("href", "");
if (dataValue.StartsWith("/watch") && dataValue.EndsWith(".html"))
{
TVShowsPageLinks[numberOfLinks] = MoviesPage.MoviesBaseLink + dataValue.Trim();
numberOfLinks++;
listItems++;
}
if (numberOfLinks > 9999)
{
break;
}
}
ImageLinks(doc);
}
catch (Exception ex)
{
ErrorDialog("There was a problem while acquiring search links.\n" + ex.Message);
}
}
private async Task<string> GetNextPageLink()
{
string lastLink = "";
string nextPageLink = "";
var doc = await new HtmlWeb().LoadFromWebAsync(currentPageLink);
foreach (var link in doc.DocumentNode.Descendants("a").Where(t => t.Attributes.Contains("href")))
{
string value = link.GetAttributeValue("href", "");
if (value.Contains(@"=&page=" + nextPage))
{
lastLink = value;
nextPageLink = value;
break;
}
}
//--------------------------------------
if (nextPageLink != "" && nextPageLink == lastLink)
{
nextPageLink = MoviesPage.MoviesBaseLink + lastLink;
nextPage++;
}
return nextPageLink;
}