【发布时间】:2017-12-01 16:05:07
【问题描述】:
我定义了以下服务。该服务应该在设备启动时运行。但是,服务已成功启动,但似乎没有调用DoBackgroundJob() 方法中的方法。当我从 MainActivity 启动服务并放置断点时,所有方法都正确执行,我得到了预期的结果。有人可以告诉这里有什么问题吗?
我已将DoBackgroundJob() 包装在一个新线程中,以便该服务在手动启动时不会阻塞应用程序的 UI。该应用程序应该在两个单独的进程中工作。
我想知道的是,像 DoBackgroundJob() 这样的异步方法是否应该包含其中的所有方法 async ?请帮我解决这个问题,因为我怀疑某些方法不足以正确调用。
[return: GeneratedEnum]
public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
{
try
{
Thread t = new Thread(() =>
{
dsa = new DataServiceAccess();
Task.Run(async () =>
{
await DoBackgroundJob();
});
});
t.Start();
}
catch (Exception ex)
{
}
base.OnStartCommand(intent, flags, startId);
return StartCommandResult.Sticky;
}
public void GetGps()
{
Device.BeginInvokeOnMainThread(() =>
{
try
{
LocationService locService = new LocationService();
GpsData = locService.GetLocation();
a = GpsData.Latitude;
b = GpsData.Longitude;
}
catch (Exception ex)
{
}
});
}
public async Task DoBackgroundJob()
{
GetGps();
try
{
ObservableCollection<Trucks> Trucks = new ObservableCollection<Trucks>();
Trucks truck = new Trucks();
TrucksService ds = new TrucksService();
beacon.DetectAvailableTrucks();
await Task.Delay(100000);
Trucks = beacon.GetAvailableTrcuks();
await MatchRequiredTrayBeacon(Truckss);
await Task.Delay(8000);
await DoBackgroundJob();
} catch (Exception e)
{
}
finally
{
}
}
private ObservableCollection<TrucksLoaded> ConstructTrucks(ObservableCollection<Trucks> trucksMatch)
{
string address = "";
List<ConfigDataModel> conf = new List<ConfigDataModel>();
conf = dsa.GetAllConfigData();
foreach (var item in conf)
{
address = item.address;
}
ObservableCollection<TrucksLoaded> TrucksLoadedFound = new ObservableCollection<TrucksLoaded>();
foreach (var item in matchedBeacon)
{
TrucksLoadedFound.Add(new TrucksLoaded(item.Id, item.Name, address, latitude,
longitude, DateTime.Now.ToString(), false, item.BatteryLife));
}
return TrucksLoadedFound;
}
public ObservableCollection<TrucksLoaded> MatchTrucks(ObservableCollection<Trucks> foundTrucks)
{
TrucksLoaded = new ObservableCollection<TrucksLoaded>();
foundTrucks = new ObservableCollection<Trucks>();
foundTrucks = HandleTrucks(foundTrucks);
TrucksLoaded = ConstructTrucks(foundTrucks);
SavetoLocalDB(TrucksLoaded);
return TrucksLoaded;
}
private ObservableCollection<Trucks> CheckMatching(ObservableCollection<Trucks> foundTrucks)
{
MatchedTrucks = new ObservableCollection<Trucks>();
// matching logic implemeted here..
return MatchedTrucks;
}
private void SavetoLocalDB(ObservableCollection<TrucksLoaded> TrucksLoaded)
{
foreach (var item in TrucksLoaded)
{
dsa.AddTrucksLoaded(item).ConfigureAwait(false);
}
}
需要在主线程上运行的位置服务部分代码
public void InitLocation()
{
if (_locationManager.AllProviders.Contains(LocationManager.NetworkProvider) && _locationManager.IsProviderEnabled(LocationManager.NetworkProvider))
{
_locationManager.RequestLocationUpdates(LocationManager.NetworkProvider, 2000, 5, this);
}
【问题讨论】:
-
我假设这是在 Android 上,而您正在使用 XF。服务中使用的任何代码是否需要初始化 Xamarin 表单(例如
Device.BeginInvokeOnMainThread)?如果是这样,您将不得不在应用程序未运行时手动初始化 XF。可能是异步代码正在吞噬异常。 -
否,代码在调试模式下正常运行。嫌疑人正在等待等。
标签: c# xamarin xamarin.android