2011-08-05 140 views
-1

我有一个疑问..回调/委托?

我想创建一个函数,它看起来就像这样......

public class A  //this is just a class file 
{ 
    function dowork() 
    { 
     //work 1 

     INPUT = here in this line it should call a delegate function or raise event etc... 

     //work 2 using INPUT 
    } 
} 

public class B 
{ 
    function myfn() 
    { 
     A objA = new A(); 
     objA.dowork(); 

    } 
} 

在“A级”我们将提高事件左右&它会显示一个窗体给用户,然后用户会输入一些值&我们需要将该值返回到A类 - > dowork方法....那么只有我们应该继续“工作2”

这也应该支持多线程...任何人都知道我们如何实现这一点?

谢谢:)

+1

当你说Windows窗体时你是什么意思?你通过asp.net标记问题,所以我相信这是一个网页,你想抓住一些用户输入? – sll

回答

0

您可以使用ManulResetEvent用于此目的:在运行输入表单,当它做到这一点的形式设置的事件,所以你可以从A.dowork方法抓住它。而在行动投入运行无限循环,检查事件状态和流程应用程序事件,让你在这个时候应用程序负责:

public class A  //this is just a class file 
{ 
    private ManualResetEvent _event; 

    public void dowork() 
    { 
    //work 1 

    _event = new ManualResetEvent(false); 
    //INPUT = here in this ... 
    Worker worker = new Worker(); 
    worker.DoInput(_event); 

    while(true) 
    { 
     if(_event.WaitOne()) 
     break; 
     Application.DoEvents(); 
    } 

    //work 2 using INPUT 
    } 
} 

class Worker 
{ 
    private ManualResetEvent _event; 

    public void DoInput(ManualResetEvent @event) 
    { 
    _event = @event; 

    // Show input form here. 
    // When it done, you call: _event.Set(); 
    } 
} 

另外,我建议你(如果你能)使用异步库(它是可作为独立设置使用)。正如你看到你只是等待,而其他的代码获得没有任何UI锁定和事件执行

public class A  //this is just a class file 
{ 
    public async void dowork() 
    { 
    //work 1 

    //INPUT = here in this ... 
    Worker worker = new Worker(); 
    wait worker.DoInput(); 

    //work 2 using INPUT 
    } 
} 

class Worker 
{ 
    public async void DoInput() 
    { 
    InputForm form = new InputForm(); 
    wait form.ShowInput(); 
    } 
} 

public class B 
{ 
    async void myfn() 
    { 
    A objA = new A(); 
    wait objA.dowork(); 
    } 
} 

:在那里,你可以更直接的方式实现它。 如果需要的话,我可以提供关于异步/等待如何工作的更深入的解释。

+0

谢谢...将检查并回复你:) – nsrajesh