質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

1158閲覧

プログレスバーを作成するにあたって、async/await 構文に関するエラーを改善してほしい

Genki0825

総合スコア3

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2020/07/30 05:37

###現状と問題点
WPFでタスクの進捗状況に従って動くプログレスバーを作成しようとしています。
そこで、ネットを参考にプログラムを作成しています。

現在、エラーが発生してており、どう対処していいのかわかりません。
以下に記載しているソースコードの
「await Task.Run(async () => 」
の箇所です。

エラーメッセージの意味と改善点について教えていただけないでしょうか。
async/await 構文やラムダ式については知ったばかりです。
よろしくお願いいたします。

###エラーメッセージ
await' 演算子は、非同期メソッド内でのみ使用できます。このメソッドに 'async' 修飾子を指定し、戻り値の型を 'Task' に変更することを検討してください。

###ソースコード
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.ComponentModel;

namespace Progress_Ver
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ViewModel();
}

private void Button_Click(object sender, RoutedEventArgs e) { var vm = this.DataContext as ViewModel; await Task.Run(async () =>                //△エラーの箇所△ { while (vm.Progress < 100) { vm.Progress += 1; await Task.Delay(10); } }); MessageBox.Show("タスクが完了しました。"); vm.Progress = 0; } }

}

// 進捗を表すための ViewModel
public class ViewModel : INotifyPropertyChanged
{
private int _Progress;
public int Progress
{
get { return this._Progress; }
set
{
this._Progress = value;
this.NotifyProperyChanged(nameof(this.Progress));
}
}

public event PropertyChangedEventHandler PropertyChanged; private void NotifyProperyChanged(string name) { this.PropertyChanged?.Invoke( this, new PropertyChangedEventArgs(name) ); }

}

ーーー<xaml>ーーー

<Window x:Class="Progress_Ver.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Progress_Ver" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">

<!-- プログレスバー --> <ProgressBar Width="200" Height="20" Minimum="0" Maximum="100" Value="{Binding Progress}" /> <Button Content="実行" Width="75" Margin="10" Click="Button_Click"/> </StackPanel>
</Window>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2020/07/30 06:14

private void Button_Click(object sender, RoutedEventArgs e) の private voidの間にasyncを入れるだけでとりあえず動きそうだけど
Genki0825

2020/07/30 07:01

BluOxy様、参考URLありがとうございます。 確認したのですが、私には難しかったです。。。 hihijiji様、ご回答ありがとうございます。 おっしゃる通りasyncを入れたら動きました。
Genki0825

2020/07/30 07:07

hihijiji様、今回はプログラムを動かすための修正点を質問しており、 ご回答頂いたので、ベストアンサーに選ばせていただきたいのですが 追記欄に書いているからでしょうか。選べません。 よろしくお願いします。 BluOxy様も参考になるサイトの紹介をしていただいたことに感謝します。
hihijiji

2020/07/30 08:28

ごめんなさい。 自己解決でお願いします。
guest

回答1

0

自己解決

private void Button_Click(object sender, RoutedEventArgs e)
のprivate voidの間にasyncを入れる

投稿2020/07/31 01:15

Genki0825

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問