5

Информация о системеApp не откажет во время отладки, но при запуске Обычно

  • Windows 10 Technical Preview (сборка 9926)
  • Visual Studio Community 2013

    Попытка отладки на:
  • [AT & T] Lumia 635 (Windows 10 Технический просмотр для телефонов для сборки 9941 w/Lumia Cyan)
  • [AT & T] Lumia 1520 (Windows Phone 8.1 с Lumia Denim и PFD)
  • [разблокирована] СИН Win Jr (Windows Phone 8.1 с PFD)
  • [Verizon] Lumia Icon (Windows Phone 8,1 с Lumia Denim и PFD)

Я пытаюсь получить услуги определения местоположения, работающих в моем приложении. Раньше у меня была ошибка Visual Studio. Это было ArgumentException с сообщением «Use of undefined keyword value 1 for event TaskScheduled in async». Googling не нашел никаких решений.

Вот код:

Geolocator Locator = new Geolocator(); 
Geoposition Position = await Locator.GetGeopositionAsync(); 
Geocoordinate Coordinate = Position.Coordinate; 

Когда я мог бы получить ошибки быть выброшен, исключение было брошено на 2-й или 3-й линии в образце выше. я упростил исходный код, чтобы попытаться исправить это, но это оригинал:

Geolocator Locator = new Geolocator(); 
Geocoordinate Coordinate = (await Locator.GetGeopositionAsync()).Position.Coordinate; 

Всего приложение работает при отладке, но падает практически мгновенно иначе.

Это универсальный проект Windows 8.1, ориентированный на проект телефона.

Заранее спасибо


EDIT: В соответствии с просьбой, вот полный метод:

private static bool CheckConnection() 
{ 
    ConnectionProfile connections = NetworkInformation.GetInternetConnectionProfile(); 
    bool internet = connections != null && connections.GetNetworkConnectivityLevel() == NetworkConnectivityLevel.InternetAccess; 
    return internet; 
} 
public static async Task<double> GetTemperature(bool Force) 
{ 
    if (CheckConnection() || Force) 
    { 
     Geolocator Locator = new Geolocator(); 
     await Task.Yield(); //Error occurs here 
     Geoposition Position = await Locator.GetGeopositionAsync(); 
     Geocoordinate Coordinate = Position.Coordinate; 
     HttpClient Client = new HttpClient(); 
     double Temperature; 
     Uri u = new Uri(string.Format("http://api.worldweatheronline.com/free/v1/weather.ashx?q={0},{1}&format=xml&num_of_days=1&date=today&cc=yes&key={2}", 
             Coordinate.Point.Position.Latitude, 
             Coordinate.Point.Position.Longitude, 
             "API KEY"), 
             UriKind.Absolute); 
     string Raw = await Client.GetStringAsync(u); 
     XElement main = XElement.Parse(Raw), current_condition, temp_c; 
     current_condition = main.Element("current_condition"); 
     temp_c = current_condition.Element("temp_C"); 
     Temperature = Convert.ToDouble(temp_c.Value); 
     switch (Memory.TempUnit) 
     { 
      case 0: 
       Temperature = Convertions.Temperature.CelsiusToFahrenheit(Temperature); 
       break; 
      case 2: 
       Temperature = Convertions.Temperature.CelsiusToKelvin(Temperature); 
       break; 
     } 
     return Temperature; 
    } 
    else 
    { 
     throw new InvalidOperationException("Cannot connect to the weather server."); 
    } 
} 

EDIT 2: Я asked for help on Twitter и received a reply просить для репрограммного проекта. Я воссоздал основную часть оригинального приложения, но я не смог получить ошибку. Однако могут возникнуть ошибки so here's the project.


EDIT 3: Если это помогает вообще, вот детали исключение:

System.ArgumentException occurred 
    _HResult=-2147024809 
    _message=Use of undefined keyword value 1 for event TaskScheduled. 
    HResult=-2147024809 
    IsTransient=false 
    Message=Use of undefined keyword value 1 for event TaskScheduled. 
    Source=mscorlib 
    StackTrace: 
     at System.Diagnostics.Tracing.ManifestBuilder.GetKeywords(UInt64 keywords, String eventName) 
    InnerException: 
+0

Вы не одиноки, проверьте [это] (https://social.msdn.microsoft. com/Форумы/windowsapps/en-US/3e505e04-7f30-4313-aa47-275eaef333dd/systemargumentexception-use-of-undefined-keyword-value-1-for-event-taskscheduled-in-async? forum = wpdevelop) и [ это] (http://stackoverflow.com/questions/24747885/argumentexception-use-of-undefined-keyword-value-1-for-event-taskscheduled-in). В качестве обходного пути посмотрите, помогает ли это: «Месторасположение геодезиста = ожидание Task.Run (() => Locator.GetGeopositionAsync());' – Noseratio

+0

@Noseratio Я пробовал все, что мог, в двух связанных вами потоках. Кроме того, я попробовал обходное решение, которое вы дали. Он по-прежнему работает безупречно во время отладки, но он все еще падает, не отлаживая. Спасибо за ваш ответ –

+0

По-видимому, это ошибка WP/WRT, я бы сообщил об этом на http://connect.microsoft.com. Кстати, попробуйте также: 'waitait Task.Yeild(); Геокоординатная координата = (ждет Локатор.GetGeopositionAsync()). Position.Coordinate; 'Сбой после' Task.Yeild() 'или после' ожидания Locator.GetGeopositionAsync() '? – Noseratio

ответ

1

Проверив this и this, я считаю, что это ошибка в .NET async/await infrastructure for WinRT.Я не мог воспроизвести его, но я рекомендую вам попробовать следующее обходное решение, посмотреть, работает ли оно для вас.

  • фактор все асинхронные awaitable вызовы из OnNavigatedTo в отдельный async Task способом, например, ContinueAsync:

    async Task ContinueAsync() 
    { 
        Geolocator Locator = new Geolocator(); 
        Geoposition Position = await Locator.GetGeopositionAsync(); 
        Geocoordinate Coordinate = Position.Coordinate; 
    
        // ... 
    
        var messageDialog = new Windows.UI.Popups.MessageDialog("Hello"); 
        await messageDialog.ShowAsync(); 
    
        // ... 
    } 
    
  • Удалить async модификатор из OnNavigatedTo и вызвать ContinueAsync из OnNavigatedTo так:

    var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); 
    Task.Factory.StartNew(
        () => ContinueAsync(), 
        CancellationToken.None, TaskCreationOptions.None, scheduler). 
        Unwrap(). 
        ContinueWith(t => 
        { 
         try 
         { 
          t.GetAwaiter().GetResult(); 
         } 
         catch (Exception ex) 
         { 
          Debug.WriteLine(ex); 
          throw; // re-throw or handle somehow 
         } 
        }, 
        CancellationToken.None,    
        TaskContinuationOptions.NotOnRanToCompletion, 
        scheduler); 
    

Дайте нам знать, если это помогает :)


Обновлено, по-видимому, ошибка находится где-то в поставщике протоколов TPL, TplEtwProvider. Вы можете видеть, что он создается, если вы добавите код ниже. До сих пор я не мог найти способ, чтобы отключить этот источник событий (либо непосредственно, либо через Reflection):

internal class MyEventListener : EventListener 
{ 
    protected override void OnEventSourceCreated(EventSource eventSource) 
    { 
     base.OnEventSourceCreated(eventSource); 
     if (eventSource.Name == "System.Threading.Tasks.TplEventSource") 
     { 
      var enabled = eventSource.IsEnabled(); 

      // trying to disable - unsupported command :(
      System.Diagnostics.Tracing.EventSource.SendCommand(
       eventSource, EventCommand.Disable, new System.Collections.Generic.Dictionary<string, string>()); 
     } 
    } 
} 

// ... 
public sealed partial class App : Application 
{ 
    static MyEventListener listener = new MyEventListener(); 
} 
+0

Спасибо за вашу помощь, но я все еще не могу заставить это работать. Я понятия не имею, почему это происходит, и я вижу, что многие другие тоже получают это. –

+0

Привет, Грег. Я думаю, что это ошибка. Я напишу его и обновлю, когда узнаю больше. Я не могу обещать, как быстро придет исправить. Пожалуйста, разместите ссылку на проект репродукции на OneDrive, и мне нужно что-то переслать в PG. –

+0

@MattSmall, PLS см. Мое обновление о источнике событий TplEtwProvider.Можно ли вообще отключить его для приложения Windows Phone/Windows Store? – Noseratio

Смежные вопросы