C#异步回调仍然在后台线程...帮助!(最好没有InvokeRequired)

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)

请告知任何想法.

Mic*_*ana 5

使用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)