更改当前方法

时间:2016-04-18 12:48:29

标签: c# multithreading asynchronous

使用任务可以执行以下操作:

public async Task SomeMethod()
{
    // [A] Here I am in the caller thread

    await OtherMethod().ConfigureAwait( false );

    // [B] Here I am in some other thread
}

private async Task OtherMethod()
{
    // Something here
}

在点[A]和[B]中,您可以处于不同的线程中。是否有可能做类似的asous async和await关键字选择线程,它会切换到?像这样:

public void SomeMethod()
{
    // [A] Here I am in the caller thread

    ChangeThread();

    // [B] Here I am in some other thread
}

private void ChangeThread()
{
    Thread thread = new Thread(???);
    // ???
}

我知道代理可以做到这一点,但是有可能在方法内部切换线程,当方法结束时可能会改变当前线程吗?如果没有,是否可以使用async / await来创建可以改变线程的东西,但是我可以控制它将切换到哪个线程(比如使用Control.Invoke的UI线程)?

1 个答案:

答案 0 :(得分:0)

在我需要更改执行上下文然后返回原始上下文的情况下,我总是这样做:

<html>
<head><title></title>
    <link rel="stylesheet" type="text/css" href="login.css">
</head>
<body>
<div id="loginform">
<center>
<form action="connectdb.php" method="POST">
    <table border=0>
        <tr><th colspan=2><h2>ACCOUNTING LOGIN</h2></th></tr>
        <tr><td colspan=2><center>Login Type: <select onchange="location = this.options[this.selectedIndex].value;">
            <option value="login.php">Accounting</option>
            <option value="login_manager.php">Manager</option>
            <option value="login_seller.php">Seller</option>
        </select></center></td></tr>
        <tr><td colspan=2>&nbsp</td></tr>
        <tr><td>Username:</td><td><input type="text" name="user"></td></tr>
        <tr><td>Password:</td><td><input type="password" name="pass"></td></tr>
    </table>
    <br>
    <input type="submit" value="LOGIN" class="submit">
    <input type="button" value="CANCEL" class="submit" onclick="window.location.href='newformat.html'">
</form>
</center>
</form>
</body>
</html>

如果您想在一个任务中执行所有任务而没有结果,只需传递数据并删除taskCompleted部分,并仅依赖于条件停止。你的代码将在另一个线程上运行,在完成后,执行将返回到你的调用线程。如果只需要使用

,那么简单而没有回报的东西就是你需要的
public async void RunWorkerAsync()
    {
        var result = await RetriveDataAsync();
    }


 public Task<Object<TItem>> RetriveResultsAsync()
    {
        var tokenSource = new CancellationTokenSource();
        var ct = tokenSource.Token;


        var source = new TaskCompletionSource<Object<TItem>>();

        var task = Task.Run(() =>
        {
            // [B] Here I am in some other thread
            while (!ConditionToStop)
            {
                if (ct.IsCancellationRequested)
                {
                    tokenSource.Cancel();
                    ct.ThrowIfCancellationRequested();
                }
            }
        }, ct).ContinueWith(taskCont =>
        {

            if (resultedData != null)
            {
                source.SetResult(resultedData);
            }
        }, ct);


        bool taskCompleted = task.Wait(2000, ct);
        if (!taskCompleted)
        {
            tokenSource.Cancel();
        }

        return source.Task;
    }

在方法中。