Estoy escribiendo una clase de ayuda asincrónica muy simple para acompañar mi proyecto. El propósito de la clase es que permite que un método se ejecute en un hilo de fondo. Aquí está el código;C# devolución de llamada asíncrona todavía en el hilo de fondo ... ayuda! (preferiblemente sin InvokeRequired)
internal class AsyncHelper
{
private readonly Stopwatch timer = new Stopwatch();
internal event DownloadCompleteHandler OnOperationComplete;
internal void Start(Func func, T arg)
{
timer.Start();
func.BeginInvoke(Done, func);
}
private void Done(IAsyncResult cookie)
{
timer.Stop();
var target = (Func) cookie.AsyncState;
InvokeCompleteEventArgs(target.EndInvoke(cookie));
}
private void InvokeCompleteEventArgs(T result)
{
var args = new EventArgs(result, null, AsyncMethod.GetEventByClass, timer.Elapsed);
if (OnOperationComplete != null) OnOperationComplete(null, args);
}
#region Nested type: DownloadCompleteHandler
internal delegate void DownloadCompleteHandler(object sender, EventArgs e);
#endregion
}
El resultado de la tarea se devuelve a través del evento OnOperationComplete
. El problema es que cuando se levanta el evento, todavía está en el hilo de fondo. Es decir. si intento ejecutar este código (a continuación) aparece un error de cruce de hilos;
txtOutput.AppendText(e.Result + Environment.NewLine);
Por favor, comunique sus ideas.
¿Estás en .NET 2.0, 3.5, 4.0? ¿Y está creando una aplicación WinForms, WPF, Silverlight? –
.NET 4.0, biblioteca de clases –