相关疑难解决方法(0)

是否有可能等待事件而不是另一个异步方法?

在我的C#/ XAML metro应用程序中,有一个启动长时间运行过程的按钮.所以,按照建议,我使用async/await来确保UI线程不被阻止:

private async void Button_Click_1(object sender, RoutedEventArgs e) 
{
     await GetResults();
}

private async Task GetResults()
{ 
     // Do lot of complex stuff that takes a long time
     // (e.g. contact some web services)
  ...
}
Run Code Online (Sandbox Code Playgroud)

偶尔,GetResults内发生的事情需要额外的用户输入才能继续.为简单起见,假设用户只需单击"继续"按钮即可.

我的问题是:如何以等待点击另一个按钮等事件的方式暂停GetResults的执行?

这是实现我正在寻找的东西的一种丑陋方式:"继续"按钮的事件处理程序设置了一个标志......

private bool _continue = false;
private void buttonContinue_Click(object sender, RoutedEventArgs e)
{
    _continue = true;
}
Run Code Online (Sandbox Code Playgroud)

...和GetResults定期轮询它:

 buttonContinue.Visibility = Visibility.Visible;
 while (!_continue) await Task.Delay(100);  // poll _continue every 100ms
 buttonContinue.Visibility = Visibility.Collapsed;
Run Code Online (Sandbox Code Playgroud)

民意调查显然非常糟糕(忙碌的等待/浪费周期),我正在寻找基于事件的东西.

有任何想法吗?

顺便说一下,在这个简化的例子中,一个解决方案当然是将GetResults()分成两部分,从开始按钮调用第一部分,从继续按钮调用第二部分.实际上,GetResults中发生的事情更复杂,并且在执行中的不同点可能需要不同类型的用户输入.因此,将逻辑分解为多种方法将是非常重要的.

c# async-await microsoft-metro .net-4.5 windows-store-apps

146
推荐指数
5
解决办法
6万
查看次数

如何在UnitTest中模拟/伪造SmtpClient?

我想用它来伪造System.Net.Mail.SmtpClientMS-Test UnitTest.因此我添加了一个Fizz Assembmly of System.dll.然后我创建一个ShimsContext和一个StubSmtpClient.

using (ShimsContext.Create())
{
   StubSmtpClient client = new StubSmtpClient();               
}
Run Code Online (Sandbox Code Playgroud)

但是我该怎么做呢?最终目标是编写一个Test,它期望使用对象调用send方法MailMessage.

c# mstest microsoft-fakes

13
推荐指数
3
解决办法
1万
查看次数