Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何等待UWP应用程序中触发EventHandler?_C#_Uwp_Async Await_Event Handling_Windows 10 Iot Core - Fatal编程技术网

C# 如何等待UWP应用程序中触发EventHandler?

C# 如何等待UWP应用程序中触发EventHandler?,c#,uwp,async-await,event-handling,windows-10-iot-core,C#,Uwp,Async Await,Event Handling,Windows 10 Iot Core,我在UWP中制作了一个简单的应用程序,我遇到了无法触发EventHandler的问题。。。我在Core.NET中制作了相同的应用程序,如果我在主函数的末尾添加“Console.ReadLine()”的话,效果会非常好,因此在触发eventhandler之前,主函数的线程似乎已经死亡 在UWP中,有没有一种方法可以让实例保持一段时间的活动状态(即:超时),从而使EventHandler有机会被触发 注:这是问题的一个例子;真正的上下文将发生在web请求的接收中 代码如下: public seale

我在UWP中制作了一个简单的应用程序,我遇到了无法触发EventHandler的问题。。。我在Core.NET中制作了相同的应用程序,如果我在主函数的末尾添加“Console.ReadLine()”的话,效果会非常好,因此在触发eventhandler之前,主函数的线程似乎已经死亡

在UWP中,有没有一种方法可以让实例保持一段时间的活动状态(即:超时),从而使EventHandler有机会被触发

注:这是问题的一个例子;真正的上下文将发生在web请求的接收中

代码如下:

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        test();
    }

    private async void test() {

        Client DiscoverClient;
        DiscoverClient = new Client();
        DiscoverClient.DeviceHandler += Client_DeviceHandler;
        await DiscoverClient.DiscoverAsync();
    }

    static private void Client_DeviceHandler(object sender, BroadlinkDevice device)
    {
        int x = 0;
    }
}
而不是使用

wait DiscoverClient.DiscoverAsync()
你可以用

\=DiscoverClient.DiscoverAsync().Result
这强制执行
test()
等待
DiscoverAsync()
返回


.Result
只能在返回类型不是
void
时使用,因此可以让
DiscoverAsync()
在完成时返回布尔值。然后,丢弃被用来进行赋值,使构造函数阻塞,直到
DiscoverAsync()
完成。

我试图将您评论中提到的库集成到我的UWP应用程序中,调用方法
GetActiveTCPCConnections
时,它将抛出“拒绝访问”表达式(Network.cs中的第60行)。因为事件客户端(u DeviceHandler)将不会触发。请在github中查看此问题()

本文档说明如何在UWP中使用套接字。您可以参考服务器示例来修改或实现该功能


我尝试了在互联网上找到的多种方法(有些使用套接字),但我没有找到有效的解决方案

我最后使用了一种解决方法:通过ip循环搜索设备的主机名。由于IP只有在路由器重新排序时才会改变,因此很少需要发现过程,因此即使有点重,对我来说也没关系:-)


谢谢你的帮助伙计们

你能说得更具体些吗?是否希望x=0,例如在调用
DiscoverAsync()
之前执行事件处理程序?由于有多种方法可以实现您想要的结果(使用
Thread.Sleep()
,使用自旋锁等),因此“x=0”如果只是一些代码,那么我可以设置断点。预期的行为是DiscoverAsync搜索网络上的设备,然后为找到的每个设备调用Client_DeviceHandler。问题是处理程序从未被调用。我无法重现这个问题,因为我不清楚客户机类的定义。你能给我提供更多关于客户机类的详细信息吗?@YanGu MSFT我正在尝试将代码中的“设备发现”集成到接收web请求的UWP web服务中(部署在Raspberry上的WIn10 IOT Core上)。我想在我的手机和家庭网络上的设备之间建立一个自定义的桥接器…也许你可以尝试使用延迟类。添加一条语句var DERRAL=新延迟(OnTaskCompleted);在test()的开头添加一个语句deleral.Complete();在测试结束时()。OnTaskCompleted是一个在延迟完成时调用的方法。DiscoverAsync返回一个任务,因此没有“结果”属性…:-(有没有一种方法可以用Task方法做类似的事情?我尝试了“Wait”方法,但它也不起作用……如果这有帮助的话,DiscoveryAsync的代码就在这里:这很奇怪,因为在我使用
Wait
的测试中,
将在方法完成之前返回,而
Wait()
只有在函数完成后才会返回,因为此方法将同步阻止当前线程。对于EventHandler,我不是专家……也许有一种使用线程的方法?也许有一种类似于我用于Core.NET版本exixts for UWP的解决方案?Id不必那么漂亮;只需工作:-)也许您可以向ClientSocket\u MessageReceived方法添加断点,并查看应用程序是否进入该方法。如果应用程序进入ClientSocket_MessageReceived方法,则需要检查response的值是否为null。