Bueno, he intentado varios métodos para hacer que esto funcione, el trabajador de fondo, Dispatcher.Invoke, el enrutamiento dentro de la clase llamada y nada parece funcionar. La mejor solución hasta el momento es un método de extensión que llama a la invocación del control. También intenté evitar pasar los datos de la etiqueta a través de mis clases de eventos y simplemente invocando dentro de mi código de procesamiento, sin embargo, esto no hizo ninguna diferencia.WPF - Actualización del contenido de la etiqueta durante el procesamiento
En cuanto al componente de fondo, recibí excepciones diciendo que el trabajador de fondo estaba ocupado, así que instalé la clase varias veces, sin embargo, la etiqueta solo cambió visible una vez que se completó la operación.
He eliminado mi código anterior, aquí hay todo lo que es relevante, ya que parece que el problema es difícil de resolver.
Método Ser llamado
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();
}
Yahoo Clase
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));
}
Clases de estado
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);
}
}
}
método que cambia las etiquetas de contenido
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();
}
}
El método estático denominado Actualizar:
public static class ExtensionMethods
{
private static Action EmptyDelegate = delegate() { };
public static void Refresh(this UIElement uiElement)
{
uiElement.Dispatcher.Invoke(DispatcherPriority.Render , EmptyDelegate);
}
otra edición: El mirar fijamente mi código para un poco más de tiempo, me he dado cuenta, que el foreach el ciclo se ejecutará realmente rápido, la operación que toma el tiempo, es
yahooResult = yahoo.ReturnLinkCount(modUri);
Por lo tanto, he declar ed la clase de estado (que maneja el evento e invoca la etiqueta, etc.) y se le suscribe. Obtuve mejores resultados, aunque todavía se siente al azar, a veces veo un par de actualizaciones de etiquetas, y a veces uno a pesar de que se pasan los mismos URI, tan extraño.
¿Es este código que se ejecuta dentro de un subproceso diferente? – decyclone
No, lamentablemente todavía no he podido arreglarlo :(. – Ash