从概念上讲,我想完成以下操作,但却无法理解如何在C#中正确编码:


SomeMethod { // Member of AClass{}
    DoSomething;
    Start WorkerMethod() from BClass in another thread;
    DoSomethingElse;
}

然后,当WorkerMethod()完成时,运行:


void SomeOtherMethod()  // Also member of AClass{}
{ ... }

任何人都可以举一个例子吗?

===============>>#1 票数:13 已采纳

为了这个目的, BackgroundWorker类已添加到.NET 2.0中。

简而言之,你做到:

BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += delegate { myBClass.DoHardWork(); }
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(SomeOtherMethod);
worker.RunWorkerAsync();

如果你想要,你还可以添加像取消和进度报告这样的花哨的东西:)

===============>>#2 票数:5

在.Net 2中引入了BackgroundWorker,这使得运行异步操作变得非常简单:

BackgroundWorker bw = new BackgroundWorker { WorkerReportsProgress = true };

bw.DoWork += (sender, e) => 
   {
       //what happens here must not touch the form
       //as it's in a different thread
   };

bw.ProgressChanged += ( sender, e ) =>
   {
       //update progress bars here
   };

bw.RunWorkerCompleted += (sender, e) => 
   {
       //now you're back in the UI thread you can update the form
       //remember to dispose of bw now
   };

worker.RunWorkerAsync();

在.Net 1中,您必须使用线程。

===============>>#3 票数:2

您必须使用AsyncCallBacks。 您可以使用AsyncCallBacks指定方法的委托,然后指定在目标方法执行完成后调用的CallBack方法。

这是一个小例子,运行并亲自看看。

课程{

    public delegate void AsyncMethodCaller();


    public static void WorkerMethod()
    {
        Console.WriteLine("I am the first method that is called.");
        Thread.Sleep(5000);
        Console.WriteLine("Exiting from WorkerMethod.");
    }

    public static void SomeOtherMethod(IAsyncResult result)
    {
        Console.WriteLine("I am called after the Worker Method completes.");
    }



    static void Main(string[] args)
    {
        AsyncMethodCaller asyncCaller = new AsyncMethodCaller(WorkerMethod);
        AsyncCallback callBack = new AsyncCallback(SomeOtherMethod);
        IAsyncResult result = asyncCaller.BeginInvoke(callBack, null);
        Console.WriteLine("Worker method has been called.");
        Console.WriteLine("Waiting for all invocations to complete.");
        Console.Read();

    }
}

===============>>#4 票数:2

虽然这里有几种可能性,但我会使用一个委托,使用BeginInvoke方法异步调用。

警告 :不要忘记始终在IAsyncResult上调用EndInvoke以避免最终的内存泄漏,如本文所述

===============>>#5 票数:1

查看BackgroundWorker。

===============>>#6 票数:1

使用异步委托:

// Method that does the real work
public int SomeMethod(int someInput)
{
Thread.Sleep(20);
Console.WriteLine(”Processed input : {0}”,someInput);
return someInput+1;
} 


// Method that will be called after work is complete
public void EndSomeOtherMethod(IAsyncResult result)
{
SomeMethodDelegate myDelegate = result.AsyncState as SomeMethodDelegate;
// obtain the result
int resultVal = myDelegate.EndInvoke(result);
Console.WriteLine(”Returned output : {0}”,resultVal);
}

// Define a delegate
delegate int SomeMethodDelegate(int someInput);
SomeMethodDelegate someMethodDelegate = SomeMethod;

// Call the method that does the real work
// Give the method name that must be called once the work is completed.
someMethodDelegate.BeginInvoke(10, // Input parameter to SomeMethod()
EndSomeOtherMethod, // Callback Method
someMethodDelegate); // AsyncState

===============>>#7 票数:0

好吧,我不确定你想怎么做。 在您的示例中,看起来WorkerMethod不会创建自己的线程来执行,但您想在另一个线程上调用该方法。

在这种情况下,创建一个调用WorkerMethod然后调用SomeOtherMethod的short worker方法,并在另一个线程上将该方法排队。 然后当WorkerMethod完成时,调用SomeOtherMethod。 例如:

public class AClass
{
    public void SomeMethod()
    {
        DoSomething();

        ThreadPool.QueueUserWorkItem(delegate(object state)
        {
            BClass.WorkerMethod();
            SomeOtherMethod();
        });

        DoSomethingElse();
    }

    private void SomeOtherMethod()
    {
        // handle the fact that WorkerMethod has completed. 
        // Note that this is called on the Worker Thread, not
        // the main thread.
    }
}

  ask by greg7gkb translate from so

未解决问题?本站智能推荐:

3回复

获取收藏集更改通知

我的班级有一个公共列表字段。 我想检测何时有人更改此收藏集。 但是,围绕此集合编写我自己的“添加/删除”包装器似乎很浪费。 有没有一种方法可以获取有关委托或类似集合更改的通知?
1回复

重构目标c中的主要委派用法

我首先要指出,我需要建议,而不是这里的代码示例。 我知道该怎么做代码... 我在一个项目中,我觉得有必要通过过度使用委托来重构单例类。 状态为有两个类,一个单例类“ Manager”和另一个类“ BackendManager”。 这两个应用程序完成了整个应用程序的客户端与服务器之
7回复

代表与 iPhoneOS中的通知

我试图从子视图控制器中调用根视图控制器中的方法,以便当我更改选项时,它们将自动更新根视图,而根视图又将更新其他几个视图控制器。 对于第二部分,我使用了通知,但是对于第一部分,我尝试使用委托,因为它(因此,我被认为是)是一种良好的编程习惯。 我无法使其正常工作,并且知道我可以轻松地设置另一个通
1回复

委托代表进行通知

可以说我有一个为0的整数(hi)。我希望通知在消息中说0。 我的代码是: 然后我得到一个错误: “指针转换不兼容的整数,将'int'发送到类型'id'的参数”
1回复

观察员/通知与代表

假设我有以下应用: 在此应用程序中,我有一个带有两个按钮的菜单,一个按钮将我带到“帖子”屏幕,另一个按钮将我带到“喜欢的帖子”屏幕。 实际的帖子在两个视图中的渲染方式完全相同,不同之处在于,其中一个帖子中的所有帖子都将选择“赞”按钮(“喜欢的帖子”屏幕),而另一个帖子中的某些帖子将
2回复

是否有类似“willShowWindow”的NSWindow通知/委托方法?

我似乎无法在文档中找到它但我正在寻找一种方法来运行一个方法,只要在我的应用程序启动后屏幕上显示一个窗口,或者它已经关闭然后再次重新打开。
3回复

NSTextField委托通知 - 如何获取文本?

我一直在努力学习使用Xcode,但我对如何注册NSTextField已经改变感到困惑。 基本上,我有一个NSTextField和一个按钮。 单击该按钮可以显示字段中的文本。 但是,我希望能够获取该字段的文本,而无需使用文本字段“操作:发送结束编辑”。 也就是说,我希望能够输入文本并立即按
2回复

UITableView编辑/完成事件

是否有通知或委托方法可用于检测表视图何时进入编辑状态? 我想要做的是检测表正在编辑,然后显示一个额外的行,显示“添加新项目”或类似的东西。 我在加载视图控制器时尝试在数组末尾添加“添加新项”行,然后根据[tableView isEditing]是否为真,返回[数组计数](对于我正在编
4回复

您对通知和代表的替代方案的看法:信号?

所以告诉我这个问题是主观的,可能会被关闭。 这确实是主观的,因为我要求经验丰富的Objective-C开发人员提出意见。 我应该在其他地方张贴这个吗? 请指教。 Objective-C相当新,虽然对编写OOP代码的概念非常有信心,但我从一开始就一直在努力应对NSNotificati
1回复

iPhone-UIToolbar-委托方法/通知/ KVC

我正在尝试在iPhone上复制邮件应用程序的设计。 在工具栏上,标签会更新/更改以显示正在发送的邮件的状态。 复制此内容的最佳方法是什么? 以下是我经过深思熟虑的内容,也许有人可以建议其中的一个为什么行得通或提出新的想法。 为了统一起见,可以说我有以下视图: A -> B