【发布时间】: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