두 번 실행 대기 코드

.net async-await asynchronous c# dapper

문제

나는 Windows 양식 응용 프로그램을 개발 중이며 DB 용으로 Dapper를 사용하고 있습니다. 내가 해결하려고하는 문제는 비동기 적으로 매개 변수가있는 저장 프로 시저를 실행하여 응용 프로그램의 실행이 중지되지 않고 일단 실행이 완료되면 사용자에게 메시지를 표시 할 수 있어야합니다.

이것은 저장 프로 시저를 호출하는 함수입니다 (ExceptionData는 단어의 일반적인 의미가 아니며 비즈니스 로직에서 다른 의미를 갖습니다)

    public async Task<bool> Load_ExceptionData(DateTime t)
    {
        IDbTransaction trans = null;
        try
        {
            trans = _connection.BeginTransaction();

            DynamicParameters prms = new DynamicParameters();
            prms.Add("Today", t ,DbType.Date);

            await _connection.ExecuteAsync("usp_CC_Load_ExceptionTable",
                                                    prms,
                                                    trans,
                                                    commandTimeout: 0,
                                                    commandType: CommandType.StoredProcedure
                                                    );


            trans.Commit();
            return true;                         
        }
        catch (Exception)
        {
            trans.Rollback();
            return false;
        }
    }

이 함수는 클릭에 대한 트리거에서 호출됩니다.

    private async void todayToolStripMenuItem_Click(object sender, EventArgs e)
    {
        try
        {
            DateTime today;
            today = Convert.ToDateTime("3/16/2016");//DateTime.Today;
            CycleCountRepository _rep = new CycleCountRepository(); // Repository

            todayToolStripMenuItem.Click -= todayToolStripMenuItem_Click; // Disabling the button so while in execution not clicked again

            if (Enabled && _rep.Check_CycleCountToday(today)) // Checks if the data is already present for the date
            {
                todayToolStripMenuItem.Image = Properties.Resources.progress;
                bool result = await _rep.Load_ExceptionData(today); // the async function
                if (result == true)
                {
                    ShowMessage("Data Load Successfully! Date: " + today, "Success", MessageBoxIcon.None); // This message is shown twice
                }
                else
                {
                    ShowMessage("Data Load Error! Date: " + today, "Warning", MessageBoxIcon.Warning);
                }
                CheckTodayLoad();
            }
            else
            {
                ShowMessage("Nothing to Load! No locations scanned today!", "Warning", MessageBoxIcon.Warning);
            }
        }
        catch (Exception ex)
        {
            ShowMessage(ex.Message, "Warning", MessageBoxIcon.Warning);
        }

    }

내가 코드를 디버깅 할 때. 처음 실행이 안타

_rep.Load_ExceptionData를 기다린다 (오늘);

클릭 이벤트 시작으로 다시 돌아가서 대기중인 줄로 돌아옵니다. 그 후 실행이 시작되고 기다리고 나면 메시지가 표시됩니다. 그러나 디버거 포인트를 표시 한 후

if (result == true) line 그리고 앞으로 나아갈 때, 안에 들어가서 다시 메시지를 보여준다.

나는 Async / await에 익숙하지 않고이 모든 것이 단지 내가했던 바보 같은 실수일지도 모른다. 하지만 여전히 나는 대답을 감사하겠습니다.

수락 된 답변

좋아, 내가 문제를 알아 냈어. 나는 아무도 내가 그랬던 것처럼 똑같은 실수를하지 않도록 나누겠습니다.

그래서 나는 폼로드에서 호출 된 함수가 있었고로드 할 데이터가 이미 테이블에 있는지 여부를 확인했습니다. "예"일 경우 ToolStripMenuItem에서 click 이벤트를 제거하고 "아니오"일 경우 추가하십시오.

내가 뭘 잘못하고 있었어?

todayToolStripMenuItem.Click += todayToolStripMenuItem_Click;

클릭 수에 두 번 더했습니다.

  • 한 번 암시 적으로 그것은 폼의 시작 부분에 추가되었습니다.

    디자인 뷰에서 컨트롤을 클릭하면. 그것은 귀하의 코드에 그것의 클릭을 추가하고 폼의 디자이너에 지정합니다.
  • 두 번째로 명시 적으로 그것을 추가했습니다.

    코드에서 줄을 확인하십시오.

해결 방법은 이벤트를 클릭하기 전에 제거하여 두 번 추가하지 않도록하는 것이 었습니다.

    private void CheckTodayLoad()
    {
        DateTime today;
        today = Convert.ToDateTime(DateTime.Today); 
        CycleCountRepository _rep = new CycleCountRepository();
        if (_rep.CheckTodayLoaded(today))
        {
            todayToolStripMenuItem.Image = Properties.Resources.checkmark;
            todayToolStripMenuItem.Text = "Today " + "[" + today.ToShortDateString() + "]" + " : Loaded";
            todayToolStripMenuItem.Click -= todayToolStripMenuItem_Click;

        }
        else
        {
            todayToolStripMenuItem.Image = SystemIcons.Warning.ToBitmap();
            todayToolStripMenuItem.Text = "Today " + "[" + today.ToShortDateString() + "]" + " : Not Loaded";
            todayToolStripMenuItem.Click -= todayToolStripMenuItem_Click; // Just to make sure it is not registered twice. Previously this line wasnt there
            todayToolStripMenuItem.Click += todayToolStripMenuItem_Click;
        }

    }

건배!


인기 답변

그런 짓을해라.

todayToolStripMenuItem.Click -= todayToolStripMenuItem_Click;

감사



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow