2017-10-28 3 views
-1

: 여기양식이 빨리 사라지지 않는 이유, 기능을 기다릴 수있는 이유는 무엇입니까? 안녕하세요 저는 코드에서 다음과 같은 한

await Task.Run(() => SomeLongRunningMethod()); 
if (dataGridViewExt1.Rows.Count > 0) 
{ 
    Log.log("Bringing in items"); 
    BringItemsIntoSystem(); 
    this.Close(); 
} 
else 
{ 
    MessageBox.Show("No items to bring in", "Complete", MessageBoxButtons.OK, MessageBoxIcon.Information); 
    Log.log("No items to bring in."); 
    this.Close(); 
} 

내 BringItemsIntoSystem() 함수와 :

public void SomeLongRunningMethod() 
     { 
      while (ContinueScanning != true) 
      { 
       Log.log("ContinueScanning is set to " + ContinueScanning.ToString()); 
       ReturnScannedItems(); 
      } 
     } 

await를 기능을 실행 : 여기

private void BringItemsIntoSystem() 
     { 
      try 
      { 
       for (int q = 0; q < dataGridViewExt1.Rows.Count; q++) 
       { 
        Creator.Insert(0); 
        Creator.SetValueByName(0, "Lookup", dataGridViewExt1.Rows[q].Cells["LOOKUP"].Value.ToString()); 
        Creator.SetValueByName(0, "Qty", dataGridViewExt1.Rows[q].Cells["Qty"].Value.ToString()); 
        Creator.Commit(0); 
        Log.log("Item added: " + dataGridViewExt1.Rows[q].Cells["LOOKUP"].Value.ToString() + " with QTY: " + dataGridViewExt1.Rows[q].Cells["Qty"].Value.ToString()); 
       } 
      } 
      catch(Exception arr) 
      { 
       Log.log(arr.ToString()); 
       MessageBox.Show(arr.ToString()); 
      } 
     } 

내 SomeLongRUnningMethod()이다 그리고 결국 그것은 말한 작업으로 끝난다. 코드를 수행하면 진행되는 진행 ... 및 "BringItemsIntoSystem"이 문제를 상당히 빨리 실행하고 필요한 작업을 수행합니다.

이제 this.Close()에 도달하면 폼을 닫는 데 매우 어려움을 겪고 있습니다.

BringItemsIntoSystem이 아무런 문제없이 잘 실행되기 때문에 무엇을 찾아야할지 모르겠습니다.

대기 기능이 문제를 일으키고 있습니까? 양식을 닫는 중 발생한 대기 시간을 치료하기 위해 할 수있는 일이 있습니까?

로그를 보면 BringItemsIntoSystem은 아무런 문제없이 완료됩니다. 나중에 볼 수 있듯이 다음을 실행해야합니다. this.Close();

이것이 바로 문제가되는 일이 아닙니다. 어떻게 설명해야 할 지 모르겠습니다.

나는 "await Task.Run ..."을 사용하지 않는 다른 프로젝트를 만들었으므로이 프로젝트와 관련이 있다고 가정하지만 BringItemsIntoSystem은 잘 작동하므로 증명 방법을 모른다. 나는 간단한 내 BringItemsIntoSystem() 함수를 교체 한

:

MessageBox.Show ("완료");

다시 말하지만 이것은 아무런 문제없이 발생합니다.

그때 그냥 내가 클릭하면 그것을 수행하는 버튼을 추가 :

this.Close();

거의 UI 모양과 비슷합니다. ... 몇 초 후까지.

확인 됨 양식이 다시 활성화되기 전에 ~ 15 초 정도 지연되어 확인란을 클릭 할 수 있습니다.

나는이 새로운 세부 사항이 누군가가 나를 이해하는 데 도움이되기를 바랍니다.

모든 도움에 감사드립니다!

+2

_ "양식을 닫는 데 매우 어려움을 겪고 있습니다."- 정확히 무엇을 의미합니까? 코드에는 노력의 개념이 없습니다. 그것은 무엇인가 할 수 있거나 불가능할 수 있습니다. 코드가 무언가를 할 수없는 경우는 아니지만 충분한 노력을 기울인 후에는 갑자기 발생할 수 있습니다.하지만 정확히 "매우 힘든 시간을 갖는"것입니다. 문제를 확실하게 재현 할 수있는 좋은 [mcve]를 갖도록 질문을 수정하십시오. State _clearly_ 그리고 _precisely_ 그 코드가하는 일, 그것이 원하는 것과는 다른 점, 그리고 _specifically_ 알아내는 데 도움이 필요한 것. –

+2

우리가 [mcve]를 만드는 데 시간을 투자한다면 정말 좋을 것입니다. 그렇게하기 위해 취하는 노력은 우리가 그것을 해결하는 것이 사소한 것이거나 그 길을 따라 문제를 파악할 것입니다. 지금 당장 당신은 유일한 대답으로 모호한 추측을하고 있습니다. 당신이 적당한 대답을 원한다면 적절한 질문을하기 위해 열심히 노력하십시오. – Enigmativity

답변

-1

대기중인 항목이 항목이 대기 된 후에 실행되지 못하도록 방해하지 않는다고 생각합니다. 나는 각 항목을 시간이 무엇인지 막을 수 있는지를 주석으로 밝힐 것을 제안합니다.

또한 해당 시간에 사용하는 리소스에 따라 정상적인 종료 시간 일 수 있습니다.

잘 읽었을 수도있는 비동기 주제에 대한 좋은 참조입니다. When correctly use Task.Run and when just async-await

+0

이것은 질문에 대한 답이 아닙니다. 질문에 대한 대답은 적어도 관찰 된 행동을 설명하고 (질문하지 않고) 질문 작성자가 구현할 수있는 _ 구체적인 해결책을 제공하려고합니다. 위의 내용은 단지 순수한 추측이며 추가 읽기를 권장합니다.이 내용은 설명이 아닌 대답에만 적합한 내용입니다. –

+0

처음에는 정상일지도 모른다고 생각했지만, 처음에는 2 번 패턴이 5 초 이내에 닫히는 것을 보았습니다 ... 세 번째 시간은 실제로 매우 오랫동안 멈 춥니 다. – losrob

+0

@PeterDuniho 당신은 100 % 정확합니다, 어떤 대답보다 더 많은 코멘트입니다. 그러나, 나는 50의 rep 지점이 코멘트와 함께 대답하기 위해 결여된다. 그래서 나는 나에게 이용 가능한 길을 갔다. – thaDanzar