backgroundtask被SocketActivityTrigger激活,但是触发器中的socket返回null

Posted

技术标签:

【中文标题】backgroundtask被SocketActivityTrigger激活,但是触发器中的socket返回null【英文标题】:Backgroundtask is activated by SocketActivityTrigger, but the socket in the trigger returns null 【发布时间】:2019-08-31 08:44:46 【问题描述】:

当我的应用程序暂停时,我希望能够使用蓝牙通过套接字发送和接收数据。一旦在前台应用程序中建立连接,我就会注册我的 BackgroundReader。

建立连接后运行代码:

    private void OnConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
               
        BackgroundTaskRegistration receiveTask = RegisterBackgroundTask("X.ReceiverTask", "ReceiverTask", new SocketActivityTrigger(), null);
        BackgroundTaskRegistration sendTask = RegisterBackgroundTask("X.Z", "SenderTask", new ApplicationTrigger(), null);

        var socket = args.Socket;
        socket.EnableTransferOwnership(receiveTask.TaskId, SocketActivityConnectedStandbyAction.DoNotWake);
        socket.TransferOwnership("RfcommSocket");
    

后台任务注册方法:

     private static BackgroundTaskRegistration RegisterBackgroundTask(string taskEntryPoint, string name, IBackgroundTrigger trigger, IBackgroundCondition condition)
            
                foreach(var cur in BackgroundTaskRegistration.AllTasks)
                
                    if(cur.Value.Name == name)
                    
                        //task is already registered
                        return (BackgroundTaskRegistration)(cur.Value);
                    
                

                var builder = new BackgroundTaskBuilder();
                builder.Name = name;
                if(taskEntryPoint != null && taskEntryPoint != String.Empty)
                
                    builder.TaskEntryPoint = taskEntryPoint;
                
                builder.SetTrigger(trigger);

                if(condition != null)
                
                    builder.AddCondition(condition);
                

                BackgroundTaskRegistration task = builder.Register();
                return task;
            

当我尝试发送数据时,Receiver 后台任务会按预期激活。只有当我尝试从其属性中读取流套接字时,它才会返回 null 并在我尝试访问它时抛出异常:

    public async void Run(IBackgroundTaskInstance taskInstance)
    
        taskDeferral = taskInstance.GetDeferral();
        taskInstance.Canceled += OnTaskCanceled;
        var details = taskInstance.TriggerDetails as SocketActivityTriggerDetails;
        var socketInformation = details.SocketInformation;
        switch (details.Reason)
        
            ...
            case SocketActivityTriggerReason.SocketActivity:
                Debug.WriteLine(socketInformation.SocketKind.ToString());
                var socket = socketInformation.StreamSocket; //This returns null
                DataReader reader = new DataReader(socket.InputStream);
                reader.InputStreamOptions = InputStreamOptions.Partial;
                await reader.LoadAsync(250);
                var dataString = reader.ReadString(reader.UnconsumedBufferLength);
                Debug.WriteLine(dataString);
                socket.TransferOwnership(socketInformation.Id); /* Important! */
                break;
            ...
        
        taskDeferral.Complete();
    

backgroundTaskHost.exe 退出,并假设它使用了套接字。

提前致谢!

【问题讨论】:

我们无法使用上面的代码来创建用于重现上述问题的完整示例,您能否分享一个迷你示例进行测试? 我可以让你访问我的 git 存储库。你愿意我加你为合作者吗? 如果您的项目是非公开的,请尝试创建一个迷你示例。 请在此处找到蓝牙服务器的工作示例:github.com/cmorschel/CommsHub 我检查了你的项目,但它错过了AssemblyInfo.cs 文件,你能添加它们吗? 【参考方案1】:

Backgroundtask被SocketActivityTrigger激活,但是触发器中的socket返回null

我检查了你的代码,问题是你在蓝牙射频通信中使用了SocketActivityTrigger。在UWP中我们经常使用RfcommConnectionTrigger来检测蓝牙消息通知。 RfcommConnectionTrigger 具有更多支持蓝牙射频通信的功能。我用官方code sample 进行了测试,它可以正确获取套接字实例并可以使用阅读器加载消息。

【讨论】:

谢谢。我已经实现了官方代码示例,并且可以正常工作。

以上是关于backgroundtask被SocketActivityTrigger激活,但是触发器中的socket返回null的主要内容,如果未能解决你的问题,请参考以下文章

BackgroundTask.define 未启动

BackgroundTask 内的 BackgroundTransfer

应用更新上的 UWP BackgroundTask

从 UWP BackgroundTask 调用 MediaCapture.InitializeAsync

iOS 13:BackgroundTasks 框架不执行后台作业

Win10 BackgroundTask