Taskとの違いはありますか?voidメソッドを実行し、Taskメソッドがnullを返しますか?

Janushoff

2つのボタンとリッチテキストボックスを備えたフォームについて考えてみます。

public partial class MainForm : Form
{
    CancellationTokenSource cts;
    CancellationToken token;

    public MainForm()
    {
        InitializeComponent();
    }

    private void MainForm_Load(object sender, EventArgs e)
    {
        cts = new CancellationTokenSource();
        token = cts.Token;
        var task = Task.Run(() => WriteSomeLines(), token);
    }

    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        cts.Dispose();
    }

    private void btnStart_Click(object sender, EventArgs e)
    {
        cts = new CancellationTokenSource();
        token = cts.Token;
        var task = Task.Run(() => WriteSomeLines(), token);
    }

    private void btnCancel_Click(object sender, EventArgs e)
    {
        try
        {
            cts.Cancel();
            cts.Dispose();
        }
        catch (ObjectDisposedException exc)
        {
            MessageBox.Show(exc.GetType().Name);
            //object disposed
        }
    }

    public void WriteSomeLines()
    {
        if (ControlInvokeRequired(rtbLoops, () => rtbLoops.Text += "Starting new loop \r\n")) ;
        else rtbLoops.Text += "Starting new loop \r\n";
        for (int i = 0; i < 30; i++)
        {
            try
            {
                if (ControlInvokeRequired(rtbLoops, () => { rtbLoops.AppendText("New line " + i + "\r\n"); rtbLoops.ScrollToCaret(); })) ;
                else rtbLoops.AppendText("New line " + i + "\r\n");

                Thread.Sleep(250);
                token.ThrowIfCancellationRequested();
            }
            catch (OperationCanceledException ae)
            {
                MessageBox.Show(ae.GetType().Name);
                return;
            }
        }
        return;
    }

    public bool ControlInvokeRequired(Control c, Action a)
    {
        if (c.InvokeRequired)
            c.Invoke(new MethodInvoker(delegate { a(); }));
        else
            return false;

        return true;
    }      
}

WriteSomeLines()voidをWriteSomeLines()返し、return insideを使用する場合、またはreturn Taskを返し、そこでnullを返す場合、違いありますか?awaitvoidreturningメソッドでは使用できないと読みましたが挿入します

await task;

タスク宣言後(上記のコード)は完全に正常にコンパイルされ、問題なく実行されます。

編集:

private async void btnStart_Click(object sender, EventArgs e)
    {
        cts = new CancellationTokenSource();
        token = cts.Token;
        var task = Task.Run(() => WriteSomeLines(), token);
        await task;
        rtbLoops.Text += "Task complete";
    }

WriteSomeLines()voidを返す場合、これは問題なくコンパイルされます。

また、少し気づかず、CancellationTokenSourceここで正しく処分していますか?

2番目の編集:

したがって、これは正しいアプローチです。

 private async void btnStart_Click(object sender, EventArgs e)
    {
        cts.Dispose();
        cts = new CancellationTokenSource();
        token = cts.Token;
        var task = Task.Run(() => WriteSomeLines(), token);
        bool result = await task;
        if(result == true) rtbLoops.Text += "Task complete \r\n";
    }

そして

public async Task<bool> WriteSomeLines()
    {
        if (ControlInvokeRequired(rtbLoops, () => rtbLoops.Text += "Starting new loop \r\n")) ;
        else rtbLoops.Text += "Starting new loop \r\n";
        for (int i = 0; i < 30; i++)
        {
            try
            {
                if (ControlInvokeRequired(rtbLoops, () => { rtbLoops.AppendText("New line " + i + "\r\n"); rtbLoops.ScrollToCaret(); })) ;
                else rtbLoops.AppendText("New line " + i + "\r\n");
                await Task.Delay(250);
                token.ThrowIfCancellationRequested();
            }
            catch (OperationCanceledException ae)
            {
                MessageBox.Show(ae.GetType().Name);
                return false;
            }
        }
        return true;
スティーブン・クリアリー

nullタスクを返さないでください。ランタイムNullReferenceExceptionエラーが発生するはずです。

あなたは使用することができますawait async voidの方法がありますが、使用することはできませんawait消費するasync void(あなたがすることができないための方法をawait void)。

私のasync紹介ブログ投稿を確認することをお勧めします; それはあなたがより良く理解を得るのを助ける必要があるasyncawait

ここでCancellationTokenSourceを正しく破棄していますか?

スタートボタンctsは、新しいものを作成するときに古いものをキャンセル/破棄する必要があります

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Task.Factory.StartNewメソッドが実行を終了しない可能性はありますか?

分類Dev

Task <T>ではなくTaskのみを返すメソッドから何を返しますか?

分類Dev

メソッドを実行した後、特定のクラス変数がnullにならないことをR#に伝える方法はありますか?

分類Dev

Taskを返すメソッドは例外をスローする必要がありますか?

分類Dev

`Func <Task>`をメソッドに渡す-func、lambda、async / await lambdaの呼び出しに違いはありますか?

分類Dev

Task <T>を返すメソッドを作成して同期的に実行できますか?

分類Dev

Task.Run(()=> Method()); メソッドを実行しませんか?

分類Dev

Laravel APIの作成メソッドと編集メソッドは何を返す必要がありますか?

分類Dev

操作を実行しない「intcreate()」メソッドにはどのような値を返す必要がありますか?

分類Dev

メソッドが決して返されないことを示す方法はありますか?

分類Dev

Java:voidメソッドは値を返しますか?

分類Dev

非同期メソッドのシグネチャエラー。void、Task、またはTask <T>を返す必要があります

分類Dev

クラスの「set」メソッドは「void」または「boolean」を返す必要がありますか?

分類Dev

Gradleを介して任意のメインメソッドを実行する方法はありますか?

分類Dev

voidメソッドとbooleanメソッドから複数の値を返します

分類Dev

Javaでは、メソッドargを--myMethod(myObjectReference)またはmyMethod(new MyObject)として渡すと、どのような違いがありますか?

分類Dev

Android Roomがエラーをスローします:削除メソッドはvoidまたはint(削除された行の数)を返す必要があります

分類Dev

メソッドの戻り値の型がVoidの場合、何を返しますか?(無効ではありません!)

分類Dev

void、Task、またはTask <T>を返さないメソッドで何かを待つ適切な方法は?

分類Dev

C#task.Start()はメソッドを実行しません

分類Dev

クラスは抽象として宣言するか、抽象メソッドを実装する必要があります

分類Dev

__init__メソッドの実行を停止する方法はありますか?

分類Dev

メソッドをパラメーターとしてメソッドに渡す方法はありますか?

分類Dev

getMap()メソッドがnullを返す可能性がありますか?

分類Dev

メソッド呼び出しが実際に何かを返すときにMockitodoNothing()を作成する方法はありますか?

分類Dev

Pythonメソッドの一時変数にselfを使用しても違いはありますか?

分類Dev

配列を反復処理してアイテムをメソッドに渡すにはどうすればよいですか?また、すべてのメソッドを同期的に実行する必要がありますか?

分類Dev

メソッドを呼び出した後、メソッドの最初の命令の前にスレッドが制御を失うことはありますか?

分類Dev

Angular:副作用があり、メソッドからObservableを返します

Related 関連記事

  1. 1

    Task.Factory.StartNewメソッドが実行を終了しない可能性はありますか?

  2. 2

    Task <T>ではなくTaskのみを返すメソッドから何を返しますか?

  3. 3

    メソッドを実行した後、特定のクラス変数がnullにならないことをR#に伝える方法はありますか?

  4. 4

    Taskを返すメソッドは例外をスローする必要がありますか?

  5. 5

    `Func <Task>`をメソッドに渡す-func、lambda、async / await lambdaの呼び出しに違いはありますか?

  6. 6

    Task <T>を返すメソッドを作成して同期的に実行できますか?

  7. 7

    Task.Run(()=> Method()); メソッドを実行しませんか?

  8. 8

    Laravel APIの作成メソッドと編集メソッドは何を返す必要がありますか?

  9. 9

    操作を実行しない「intcreate()」メソッドにはどのような値を返す必要がありますか?

  10. 10

    メソッドが決して返されないことを示す方法はありますか?

  11. 11

    Java:voidメソッドは値を返しますか?

  12. 12

    非同期メソッドのシグネチャエラー。void、Task、またはTask <T>を返す必要があります

  13. 13

    クラスの「set」メソッドは「void」または「boolean」を返す必要がありますか?

  14. 14

    Gradleを介して任意のメインメソッドを実行する方法はありますか?

  15. 15

    voidメソッドとbooleanメソッドから複数の値を返します

  16. 16

    Javaでは、メソッドargを--myMethod(myObjectReference)またはmyMethod(new MyObject)として渡すと、どのような違いがありますか?

  17. 17

    Android Roomがエラーをスローします:削除メソッドはvoidまたはint(削除された行の数)を返す必要があります

  18. 18

    メソッドの戻り値の型がVoidの場合、何を返しますか?(無効ではありません!)

  19. 19

    void、Task、またはTask <T>を返さないメソッドで何かを待つ適切な方法は?

  20. 20

    C#task.Start()はメソッドを実行しません

  21. 21

    クラスは抽象として宣言するか、抽象メソッドを実装する必要があります

  22. 22

    __init__メソッドの実行を停止する方法はありますか?

  23. 23

    メソッドをパラメーターとしてメソッドに渡す方法はありますか?

  24. 24

    getMap()メソッドがnullを返す可能性がありますか?

  25. 25

    メソッド呼び出しが実際に何かを返すときにMockitodoNothing()を作成する方法はありますか?

  26. 26

    Pythonメソッドの一時変数にselfを使用しても違いはありますか?

  27. 27

    配列を反復処理してアイテムをメソッドに渡すにはどうすればよいですか?また、すべてのメソッドを同期的に実行する必要がありますか?

  28. 28

    メソッドを呼び出した後、メソッドの最初の命令の前にスレッドが制御を失うことはありますか?

  29. 29

    Angular:副作用があり、メソッドからObservableを返します

ホットタグ

アーカイブ