相关疑难解决方法(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万
查看次数

如何在c#中触发事件之前阻塞

在提出这个问题之后,我想知道是否可以等待事件被触发,然后获取事件数据并返回其中的一部分.有点像:

private event MyEventHandler event;
public string ReadLine(){ return event.waitForValue().Message; }
...
event("My String");
...elsewhere...
var resp = ReadLine();
Run Code Online (Sandbox Code Playgroud)

请确保您提供的任何解决方案都直接返回值,而不是从其他地方获取.我问的是上面的方法是否以某种方式可用.我知道Auto/ManuelResetEvent,但我不知道他们像我上面那样直接返回值.

更新:我使用MyEventHandler(包含一个Message字段)声明了一个事件.我在另一个线程中有一个方法,叫做ReadLine等待事件触发.当事件触发WaitForValue方法(事件处理场景的一部分)时,返回包含消息的事件args.然后,ReadLine将消息返回给任何调用它的消息.

接受答案这个问题我问的是我做什么,但它只是感觉并不完全正确.几乎感觉ManuelResetEvent触发和检索数据并返回它的程序之间的数据可能会发生.

更新:主要问题Auto/ManualResetEvent是它太脆弱了.线程可以等待事件,然后在将其更改为其他内容之前,没有足够的时间让其他人获取它.有没有办法使用锁或其他东西?也许使用get和set语句.

c# events

54
推荐指数
2
解决办法
9万
查看次数

如何在 C# 中触发事件之前阻止代码流

在这里,我们有一个Grid带有Button. 当用户单击按钮时,会执行 Utility 类中的一个方法,该方法强制应用程序接收对 Grid 的单击。代码流必须在此处停止,并且在用户单击Grid.

我在这里之前也有过类似的问题:

等到用户单击 C# WPF

在那个问题中,我使用 async/await 得到了一个有效的答案,但是由于我要将它用作 API 的一部分,因此我不想使用 async/await,因为消费者将不得不用我不想要的异步。

我如何编写Utility.PickPoint(Grid grid)方法来实现这个目标?

我看到这可能会有所帮助,但老实说,我并没有完全理解它适用于这里:

阻塞直到事件完成

将其视为控制台应用程序中的 Console.ReadKey() 方法。当我们调用这个方法时,代码流停止,直到我们输入某个值。直到我们输入一些东西,调试器才会继续。我想要 PickPoint() 方法的确切行为。代码流将停止,直到用户单击网格。

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="3*"/>
            <RowDefinition Height="1*"/>
        </Grid.RowDefinitions>

        <Grid x:Name="View" Background="Green"/>
        <Button Grid.Row="1" Content="Pick" Click="ButtonBase_OnClick"/>
    </Grid>
</Window>

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        // …
Run Code Online (Sandbox Code Playgroud)

c# wpf events autoresetevent async-await

10
推荐指数
2
解决办法
978
查看次数