我有以下代码将查询发送到youtube并将总结果发送到文本框。如果我只是提醒结果,没关系,但我不能将结果分配给文本框。请向我解释为什么?NET中的BeginInvoke问题
private void SearchVideo(string keyword)
{
string orderBy = "";
switch (cboSortBy.SelectedIndex)
{
case 1: orderBy = "published"; break;
case 2: orderBy = "viewCount"; break;
case 3: orderBy = "rating"; break;
default: orderBy = "relevance"; break;
}
SearchDelegate sd = Search;
sd.BeginInvoke(keyword, orderBy, SearchCompleted, sd);
}
private void SearchCompleted(IAsyncResult ar)
{
if (null == ar) return;
SearchDelegate sd = ar.AsyncState as SearchDelegate;
Feed<Video> result = sd.EndInvoke(ar);
txtSearch.Text = result.TotalResults.ToString();
}
private Feed<Video> Search(string keyword, string orderBy)
{
YouTubeQuery query = new YouTubeQuery(YouTubeQuery.DefaultVideoUri);
query.OrderBy = orderBy;
query.Query = keyword;
query.SafeSearch = YouTubeQuery.SafeSearchValues.None;
return GetRequest().Get<Video>(query);
}
和错误
跨线程操作无效: 控制“txtSearch”从比它的线程上创建 以外的 线程访问。
BeginInvoke仍然阻止GUI :( – 2010-01-17 15:15:10
@新鸡:你究竟是什么意思?BeginInvoke在调用委托和控件时都是非阻塞的。以我描述的方式使用BeginInvoke * will *会工作,并且不会阻塞UI。如果您遇到问题,请给出一个简短但完整的程序来演示此问题。 – 2010-01-17 15:50:02
这是我在C#2008EE中的项目http://www.mediafire.com/?n220ddoi2i2 请检查我,谢谢你。 – 2010-01-17 16:04:55