嗯,我已經嘗試了幾種方法來使其工作,後臺工作者,Dispatcher.Invoke,被調用類中的線程以及任何東西似乎都不起作用。到目前爲止,最好的解決方案是調用控件調用的擴展方法。此外,我已經嘗試避免通過我的事件類傳遞標籤的數據,並簡單地在我的處理代碼中調用,但這沒有什麼區別。WPF - 處理過程中更新標籤內容
關於後臺組件,我不斷收到異常說明後臺工作人員很忙,所以我實例化了這個類幾次,但是標籤只有在整個操作完成後才明顯改變。
我已經刪除了我以前的代碼,這裏是所有相關的,因爲它看起來問題很難解決。
方法被稱爲
private void TestUris()
{
string text = new TextRange(rtxturis.Document.ContentStart, rtxturis.Document.ContentEnd).Text;
string[] lines = Regex.Split(text.Remove(text.Length - 2), "\r\n");
foreach (string uri in lines)
{
SafeUpdateStatusText(uri);
bool result;
string modUri;
if (!uri.Contains("http://"))
{
modUri = uri;
result = StoreData.LinkUriExists(new Uri("http://" + modUri));
}
else
{
modUri = uri.Substring(7);
result = StoreData.LinkUriExists(new Uri(uri));
}
if (!result)
{
Yahoo yahoo = new Yahoo();
yahoo.Status.Sending += (StatusChange);
uint yahooResult = 0;
yahooResult = yahoo.ReturnLinkCount(modUri);
if (yahooResult > 1000)
{ results.Add(new ScrapeDetails(Guid.NewGuid(), modUri, 1000, "Will be processed", true)); }
else
{ results.Add(new ScrapeDetails(Guid.NewGuid(), modUri, (int)yahooResult, "Insufficient backlinks", false)); }
}
else
{
results.Add(new ScrapeDetails(Guid.NewGuid(), modUri, 0, "Previously been processed", false));
}
}
foreach (var record in results)
{
dgvresults.Items.Add(record);
}
EnableStartButton();
}
雅虎類
public class Yahoo
{
/// <summary>
/// Returns the amount of links each Uri has.
/// </summary>
public uint ReturnLinkCount(string uri)
{
string html;
Status.Update(uri, false); //this is where the status is called
try
{
html = client.DownloadString(string.Format("http://siteexplorer.search.yahoo.com/search?p=http%3A%2F%2F{0}&fr=sfp&bwm=i", uri));
}
catch (WebException ex)
{
ProcessError(ex.ToString());
return 0;
}
return (LinkNumber(html));
}
狀態類
public class StatusEventArgs : EventArgs
{
private string _message;
private bool _isidle;
public StatusEventArgs(string message, bool isidle)
{
this._message = message;
this._isidle = isidle;
}
public bool IsIdle
{
get { return _isidle; }
}
public string Message
{
get { return _message; }
}
}
public class Status
{
public Status()
{
}
// Declaring an event, with a custom event arguments class
public event EventHandler<StatusEventArgs> Sending;
// Some method to fire the event.
public void Update(string message, bool isIdle)
{
StatusEventArgs msg = new StatusEventArgs(message, isIdle);
OnUpdate(msg);
}
// The method that invokes the event.
protected virtual void OnUpdate(StatusEventArgs e)
{
EventHandler<StatusEventArgs> handler = Sending;
if (handler != null)
{
handler(this, e);
}
}
}
方法的內容改變
private void StatusChange(object sender, StatusEventArgs e)
{
if(!e.IsIdle)
{
lblstatus.Content = e.Message;
lblstatus.Foreground = StatusColors.Green;
lblstatus.Refresh();
}
else
{
lblstatus.Content = e.Message;
lblstatus.Foreground = StatusColors.Grey;
lblstatus.Refresh();
}
}
標籤
稱爲刷新靜態方法:
public static class ExtensionMethods
{
private static Action EmptyDelegate = delegate() { };
public static void Refresh(this UIElement uiElement)
{
uiElement.Dispatcher.Invoke(DispatcherPriority.Render , EmptyDelegate);
}
另一個編輯:在我的多一點的時間碼凝望,我已經意識到,在foreach循環會執行得非常快,需要花費時間的操作是
yahooResult = yahoo.ReturnLinkCount(modUri);
因此我聲明編輯狀態類(處理事件並調用標籤等)並將其引發。我已經得到了更好的結果,雖然它仍然是隨機的,有時我會看到一些標籤更新,有時候,即使通過了完全相同的URI,也很奇怪。
此代碼不同的線程內部執行? – decyclone 2010-08-02 14:52:10
不幸的是,我仍然沒有設法修復它:(。 – Ash 2010-08-02 16:38:35