【问题标题】:Backgroundtask is activated by SocketActivityTrigger, but the socket in the trigger returns nullbackgroundtask被SocketActivityTrigger激活,但是触发器中的socket返回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 文件,你能添加它们吗?

标签: c# sockets uwp bluetooth background-task


【解决方案1】:

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

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

【讨论】:

  • 谢谢。我已经实现了官方代码示例,并且可以正常工作。
猜你喜欢
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
  • 2012-08-02
相关资源
最近更新 更多