java中异步的作用,后台任务中的异步调用不起作用

在我的应用程序中,我需要在后台扫描Wi-Fi接入点 . 我能够启动任务并初始化Wi-Fi适配器,但是下一次异步调用“await scanner.ScanForNetworks()”执行扫描似乎永远不会完成任务 . 它可能是众多嵌套异步调用的结果吗?如果是这样,可能的解决办法是什么?

ScanningTask.cs

namespace BackgroundTaskLibrary

{

public sealed class ScanningTask : IBackgroundTask

{

private BackgroundTaskDeferral deferral;

private WiFiScanner scanner = new WiFiScanner();

private Windows.Storage.ApplicationDataContainer localSettings;

private DispatcherTimer timer;

public async void Run(IBackgroundTaskInstance taskInstance)

{

deferral = taskInstance.GetDeferral();

taskInstance.Canceled += TaskInstance_Canceled;

await scanner.InitializeFirstAdapter();

ShowToastNotification("Hi", "Hello from background"); //notification is shown

await scanner.ScanForNetworks();

ShowToastNotification("Hi", "Hello from background1"); //this one never gets shown

deferral.Complete();

}

private void TaskInstance_Canceled(IBackgroundTaskInstance sender,

BackgroundTaskCancellationReason reason)

{

deferral.Complete();

}

private void ShowToastNotification(string title, string stringContent)

{

ToastNotifier ToastNotifier = ToastNotificationManager.CreateToastNotifier();

Windows.Data.Xml.Dom.XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);

Windows.Data.Xml.Dom.XmlNodeList toastNodeList = toastXml.GetElementsByTagName("text");

toastNodeList.Item(0).AppendChild(toastXml.CreateTextNode(title));

toastNodeList.Item(1).AppendChild(toastXml.CreateTextNode(stringContent));

Windows.Data.Xml.Dom.IXmlNode toastNode = toastXml.SelectSingleNode("/toast");

Windows.Data.Xml.Dom.XmlElement audio = toastXml.CreateElement("audio");

audio.SetAttribute("src", "ms-winsoundevent:Notification.SMS");

ToastNotification toast = new ToastNotification(toastXml);

toast.ExpirationTime = DateTime.Now.AddSeconds(10);

ToastNotifier.Show(toast);

}

}

}

WiFiAdapter.cs

namespace BackgroundTaskLibrary

{

class WiFiScanner

{

//WiFi adapter instance

public WiFiAdapter WiFiAdapter { get; private set; }

public Geolocator _geolocator = new Geolocator();

public Geoposition Location { get; set; }

///

/// Find the fisrts available WiFi adapter and initialise it

///

///

public async Task InitializeFirstAdapter()

{

var access = await WiFiAdapter.RequestAccessAsync();

if (access != WiFiAccessStatus.Allowed)

{

throw new Exception("WiFiAccessStatus not allowed");

}

else

{

var wifiAdapterResults =

await DeviceInformation.FindAllAsync(WiFiAdapter.GetDeviceSelector());

if (wifiAdapterResults.Count >= 1)

{

this.WiFiAdapter =

await WiFiAdapter.FromIdAsync(wifiAdapterResults[0].Id);

}

else

{

var dialog = new MessageDialog("WiFi Adapter not found.");

await dialog.ShowAsync();

throw new Exception("WiFi Adapter not found.");

}

}

}

public async Task ScanForNetworks()

{

if (WiFiAdapter != null)

{

await WiFiAdapter.ScanAsync();

}

else

{

throw new Exception("No Wi-Fi adapter");

}

Location = await _geolocator.GetGeopositionAsync();

List accessPoints = new List();

foreach(var network in WiFiAdapter.NetworkReport.AvailableNetworks)

{

AccessPoint ap = new AccessPoint()

{

SSID = network.Ssid,

Mac = network.Bssid,

SignalStrength = network.NetworkRssiInDecibelMilliwatts,

Open = (int)network.SecuritySettings.NetworkAuthenticationType

};

accessPoints.Add(ap);

}

await SaveData(accessPoints);

}

public async Task SaveData(List accessPoints)

{

string info = DateTime.Now + "|" + Location.Coordinate.Point.Position.Latitude

+ "|" + Location.Coordinate.Point.Position.Longitude + "|";

for (int i = 0; i < accessPoints.Count; i++)

{

info += accessPoints[i].ToString();

}

info += Environment.NewLine;

// Get the logical root folder for all external storage devices.

StorageFolder externalDevices = Windows.Storage.KnownFolders.RemovableDevices;

// Get the first child folder, which represents the SD card.

StorageFolder sdCard = (await externalDevices.GetFoldersAsync()).FirstOrDefault();

StorageFile infoFile;

if (sdCard != null)

{

//check if info file exists

try

{

infoFile = await sdCard.GetFileAsync("wifiScanInfo.txt");

}

catch

{

infoFile = await sdCard.CreateFileAsync("wifiScanInfo.txt");

}

await FileIO.AppendTextAsync(infoFile, info);

}

}

}

}

编辑:

通过随后简化ScanningTask我能够确定,问题在于调用“await WiFiAdapter.ScanAsync();”

我终于设法从“等待WiFiAdapter.ScanAsync();”中捕获异常,这里是堆栈跟踪:

Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

at System.Runtime.CompilerServices.TaskAwaiter.GetResult()

at BackgroundTaskLibrary.WiFiScanner.d__10.MoveNext()

但是,扫描已完成,结果将按预期保存在文本文件中 . 我可能缺少哪些权限?我已经声明了Internet,位置和可移动存储权限 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值