在app start上启动异步任务,等待稍后点击按钮

时间:2017-07-14 05:45:52

标签: c# multithreading uwp

我有一个Windows 10 UWP应用程序,我想尽快开始对某些类进行初始化,之后才需要完成它们。

我是多线程编程的新手,所以对我的方法明显愚蠢道歉。

我在App构造函数中启动了一个任务,将任务分配给静态属性:

sealed partial class App : Application {
    ...
    internal static Task CoreIntialisationTask { get; set; }

    public App() {
        this.InitializeComponent();

        CoreIntialisationTask = StartInitialisation();

        this.Suspending += OnSuspending;
    }

    private async Task StartInitialisation() {
        await InitialiseService1Async();
        var service2Task = this.InitializeService2Async();
        var service3Task = this.InitializeService3Async();
        await service2Task;
        await service3Task;
    }

    ...
}

然后在我的第一个加载页面中,点击按钮,是这些服务需要完全初始化的最新时刻,所以我添加了检查状态并等待呼叫:

private async void btnStart_Click(object sender, RoutedEventArgs e) 
{
    if (App.CoreIntialisationTask.Status == TaskStatus.Running)
    {
        await App.CoreIntialisationTask;
        ...
    }
    ...
}

但是,此时的CoreIntialisationTask状态为具有以下内部异常的失败:

(new System.Threading.Tasks.SystemThreadingTasks_FutureDebugView<System.Threading.Tasks.VoidTaskResult>(App.CoreIntialisationTask).Exception).InnerException.Message
The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))

at Windows.UI.Xaml.Application.get_Resources()
at MyApplication.App.<InitializeService>d__26.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at MyApplication.App.<StartInitialisation>d__25.MoveNext()

StartInitialisation()方法似乎转到了await service2Task但从来没有await service3Task;行。

我是以完全错误的方式接近这个还是我在这里缺少一些更小的东西?

1 个答案:

答案 0 :(得分:0)

您需要检查服务器状态或过程 如果您需要服务器,可以使用:

Public Sub StratServices(ByVal servername As String)
    Try
        Dim service As ServiceController = New ServiceController(servername)
        If service.Status = ServiceControllerStatus.Stopped Then
            service.Start()
            service.Refresh()
        End If
    Catch ex As Exception
        MsgBox("You dont have Sql Srver in your Machine")
    End Try
End Sub

By use System.Serviceprocess