- PR -

処理を一度しか走らせないようにしたい

投稿者投稿内容
あや☆
常連さん
会議室デビュー日: 2005/07/28
投稿数: 36
投稿日時: 2005-11-10 18:25
いつもお世話になっております。
C#,NET でWEBアプリの開発をしております。

現在困っている事象ですが、
ボタンをクリックすると走る処理がだいぶ時間がかかる処理なため、
処理が終わるのを待っている間にもう一度ボタンを押すと、
二重に処理が走ってしまいます。
その処理が走っている間は、そのボタンを押しても処理は走らないようにしたいのですが、
方法をご存知の方、いらっしゃいませんか?

いくつか検証してみたのですが、
以下のように、フラグを設けて、クリックイベントの最初で、フラグをたて、
フラグがたってたら処理はしないということをやってみてもダメでした。

★Clickイベント
if(Flg==0)
{
  Flg=1;
時間がかかる処理
}

Flg=1;と書いてある行を通った時に、Flgに1がセットされるわけではないみたいですね。

クリックイベントの最初でボタンを押下不可にしてみても、
同じくダメでした。
押下不可になるのはClickイベントが完了した時なようです。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2005-11-10 18:29
引用:

★Clickイベント
if(Flg==0)
{
  Flg=1;
時間がかかる処理
}


Flgをプロシージャ内のStatic変数(VBでいうところの)にしたらどうなりますか?
#StaticはC#ではなんだろう。。。

コード:

Static Executing As Boolean = False
If Executing Then
Exit Sub
End If
Executing = True
・・・・・
Executing = False



#↑書いては見たもののなんか根本的な解決で無いような気がしてきた(--;

[ メッセージ編集済み 編集者: まどか 編集日時 2005-11-10 18:35 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-10 18:37
これって、「1回だけ」とはいえ、「接続してきた人ごとに1回だけ」ですよね?
staticにすると、「全体で1回だけ」になりません?

セッションにフラグを持たせる、ですかね。
___________________________________________________________________
□ written by Jitta on 2005/11/10
□ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006
_________________
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-11-10 18:37
こんにちは。

引用:

押下不可になるのはClickイベントが完了した時なようです。


処理した結果がクライアントに返って初めて意味を持ちます。なので、「時間のかかる処理」をしている間は、クライアントに結果が返っていないので、ボタンは押下不可になりません。

引用:

Flg=1;と書いてある行を通った時に、Flgに1がセットされるわけではないみたいですね


どこかに保持しておかないと、また 0 に戻ってしまいます。
まぁいずれにせよ、押下不可と同様、クライアントに処理が返ってないので意味ないです。

Javascript に詳しくないので断言できませんが、クライアントスクリプトで押下不可にしてみるとか、一度別の画面にするだとか工夫が必要みたいですね。

以前 @IT の掲示板で同様事を議論している所がありました。見つけたらまた書きます。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2005-11-10 18:37
Webですよね。
この場合、サーバ側の処理はブラウザからのリクエストが上がることにより
実行されます。

> 以下のように、フラグを設けて、クリックイベントの最初で、フラグをたて、
> フラグがたってたら処理はしないということをやってみてもダメでした。

ブラウザ側で2回ボタンが押されたら、この処理が動くためのサーバへの
リクエストが2回あがってしまいます。
なので、このようなフラグで問題を解決することはできません。

ブラウザ側のスクリプトでボタンをクリックした時点でボタンを処理できない
ようにする、とか、長い処理に入る前に処理中を表示するようなページに
遷移してしまう等の仕組みを考える必要があります。

なお、処理中を表示するページをどうつくるか、という話は「ASP.NETでいってみよう」
という本に載っているやり方が私はスマートだと思います。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2005-11-10 18:41
引用:

staticにすると、「全体で1回だけ」になりません?


Webに疎いのがばればれですね<私m(_ _)m
あや☆
常連さん
会議室デビュー日: 2005/07/28
投稿数: 36
投稿日時: 2005-11-10 19:01
みなさま、返信ありがとうございました。

やはりこのようなFlgでは実現できないのですね。。。
私もWEBについてはよく分かっていないので、とても勉強になりました。

ちょっと最初の質問からはずれますが、
staticについて教えてください。
Jittaさんにの返信によると、staticで宣言された変数というのは、
Webアプリを実行してきた人、みんなが共有してしまうということですか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-10 19:03
引用:

まどかさんの書き込み (2005-11-10 18:29) より:

Flgをプロシージャ内のStatic変数(VBでいうところの)にしたらどうなりますか?
#StaticはC#ではなんだろう。。。


「static 変数」と CShaper な人に言うと誤解を招きます。
C# の static (静的) 変数は、VB でいうところの Shared (共有メンバ) 変数になります。

VB でいうところの Static なローカル変数は、C# にはありません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)