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 内的 BackgroundTransfer
从 UWP BackgroundTask 调用 MediaCapture.InitializeAsync