使用代码按下按钮,按钮功能在C#中是异步的

时间:2017-04-12 14:04:36

标签: c# .net wpf asynchronous microsoft-cognitive

所以我有一个按钮和点击它时运行的功能签名:

private async void StartButton_Click(object sender, RoutedEventArgs e)

我需要在特定时刻每天按下此按钮。我当然正在使用DateTime。我只是想知道如何使它运行,因为它得到了两个参数。

编辑:

所以我尝试了一些答案,但我每次都会得到一个例外。有趣的部分是当我实际点击按钮时没有发生异常。正当我试图调用它的事件时。

实际上代码不是我的代码,它是微软的开源项目。 代码:

private async void StartCamera()
{
    if (!CameraList.HasItems)
    {
        MessageArea.Text = "No cameras found; cannot start processing";
        return;
    }

    // Clean leading/trailing spaces in API keys. 
    Properties.Settings.Default.FaceAPIKey = Properties.Settings.Default.FaceAPIKey.Trim();
    Properties.Settings.Default.EmotionAPIKey = Properties.Settings.Default.EmotionAPIKey.Trim();
    Properties.Settings.Default.VisionAPIKey = Properties.Settings.Default.VisionAPIKey.Trim();

    // Create API clients. 
    _faceClient = new FaceServiceClient(Properties.Settings.Default.FaceAPIKey);
    _emotionClient = new EmotionServiceClient(Properties.Settings.Default.EmotionAPIKey);
    _visionClient = new VisionServiceClient(Properties.Settings.Default.VisionAPIKey);

    // How often to analyze. 
    _grabber.TriggerAnalysisOnInterval(Properties.Settings.Default.AnalysisInterval);

    // Reset message. 
    MessageArea.Text = "";

    // Record start time, for auto-stop
    _startTime = DateTime.Now;


    await _grabber.StartProcessingCameraAsync(CameraList.SelectedIndex);
}

private async void StartButton_Click(object sender, RoutedEventArgs e)
{
    StartCamera();
}

我应该补充一点,StartCamera方法最初并不存在,但是为了按照建议为函数创建非参数用途而添加。

当我尝试使用例如调用它时,我总是得到一个invalidOperationException:

StartButton.RaiseEvent(new RoutedEventArgs(System.Windows.Controls.Primitives.ButtonBase.ClickEvent));

此异常的信息是:{"调用线程无法访问此对象,因为另一个线程拥有它。"}

所以基本上我觉得这个例外并没有真正帮助我理解为什么实际按下按钮很好但调用它不是。

由于

编辑2:

问题仍在继续:

Invoking an onclick on button threw code in a different thread in C#

如果有人对将来感兴趣。

1 个答案:

答案 0 :(得分:1)

如何调用方法?

StartButton_Click(this, new RoutedEventArgs());

您也可以定义一个没有参数的方法,您可以从事件处理程序和计时器调用这些参数:

private async void StartButton_Click(object sender, RoutedEventArgs e)
{
    TheMethod();
}

然后你不需要关心参数。

第三种选择是以编程方式提升事件:

button.RaiseEvent(new RoutedEventArgs(System.Windows.Controls.Primitives.ButtonBase.ClickEvent));