7 c# generics events delegates asynchronous
我正在编写一个非常简单的异步助手类来配合我的项目.该类的目的是允许方法在后台线程上运行.这是代码;
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
}
Run Code Online (Sandbox Code Playgroud)
然后通过OnOperationComplete事件返回任务的结果.问题是,当事件被引发时,它仍然在后台线程上.即如果我尝试运行此代码(如下),我会遇到交叉线程错误;
txtOutput.AppendText(e.Result + Environment.NewLine);Run Code Online (Sandbox Code Playgroud)
请告知任何想法.
使用BackgroundWorker类.它基本上和你想要的一样.
private BackgroundWorker _worker;
public Form1()
{
InitializeComponent();
_worker = new BackgroundWorker();
_worker.DoWork += Worker_DoWork;
_worker.RunWorkerCompleted += Work_Completed;
}
private void Work_Completed(object sender, RunWorkerCompletedEventArgs e)
{
txtOutput.Text = e.Result.ToString();
}
private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
e.Result = "Text received from long runing operation";
}
Run Code Online (Sandbox Code Playgroud)