在UI线程中将异步调用转换为同步调用

时间:2011-07-29 09:24:46

标签: c# wpf silverlight telerik-window

我正在尝试为MVVM设计模式实现IView,它允许ViewModel使用IView实现的类与用户交互。 IView界面具有提示,警报和功能等功能。确认。我有三个IView接口的实现:CommandLineInteraction,WPFInteraction& TelerikInteraction。前两个行为相似(即,它们是同步的)。第三个是异步工作。

我希望TelerikInteraction同步工作。这意味着,调用RadWindow.Confirm()或RadWindow.Prompt()之后的代码应该等到用户进行交互。

以下是所有三种实现的代码片段:

    //CommandLine Implementation
    public CustomConfirmResult Confirm(string message) {
        Console.WriteLine(message);
        Console.WriteLine("[Y]es    [N]o");
        string s = Console.ReadLine();

        if(s == y || s == Y)
            return CustomConfirmResult.Yes;
        else
            return CustomConfirmResult.No;
    }

    //Windows Implementation
    public CustomConfirmResult Confirm(string message) {
        MessageBoxResult mbr = MessageBox.Show(message, "", MessageBoxButton.OKCancel);

        if(mbr == MessageBoxResult.OK)
            return CustomConfirmResult.Yes;
        else
            return CustomConfirmResult.No;
    }

    //Telerik Implementation
    public CustomConfirmResult Confirm(string message) {
        CustomConfirmResult result;

        RadWindow.Confirm(new DialogParameters{
            Content=message,
            Closed = (o1, e1) =>{
                if(e1.DialogResult == true)
                    result = CustomConfirmResult.Yes;
                else
                    result = CustomConfirmResult.No;
            }
        });

        return result; //Executed before user interacts with the confirm dialog
    }

如何使这些实现在行为上相似?

谢谢,

Sunil Kumar

1 个答案:

答案 0 :(得分:1)

Silverlight旨在异步工作。尝试使其同步工作将限制产品的响应能力。

您应该停止使用MessageBox并转而使用完全异步编码模型。

拥有onCancel和onConfirm委托或动作的辅助方法(或onYes,onNo或任何你喜欢的方法)是编写问题&的最简单方法。回答你所追求的情况。