1

WCF サービスで 2 つの関数を作成し、非同期を使用して Silverlight で呼び出します。メソッドを次々と呼び出しますが、最初のメソッドが完了する前に、Silverlight は 2 番目のメソッドを実行します。2 番目のメソッド呼び出しの前に、最初のメソッドの実行が完全に終了するようにします。私のコードを貼り付けて返信していただきありがとうございます。実装方法をコードで提案してください。

          private GDOperations.GDDoneOperationsClient _gdDoneOperation;
           private ImageOperationsClient proxy = null;
           foreach (var file in _filesCollection)
           {
            clsImageTransactionEntity _clsImageEntity = new clsImageTransactionEntity();
            _clsImageEntity.ImageByte = GetFileData(file.OpenRead());
            _clsImageEntity.ImageExtension = file.Extension;
            _clsImageEntity.ImageName = file.Name;
            _clsImageEntity.ImageType = 2;
            _clsImageEntity.ImagePath = "~/CMSImages/FinalImages/" + lblSelectedBarcode.Content.ToString() + "/" + file.Name;
            _clsImageEntity.JabongBarcode = lblSelectedBarcode.Content.ToString();


            GDOperations.clsImageTransactionEntity _clsImageGDEntity = new GDOperations.clsImageTransactionEntity();
            _clsImageGDEntity.ImageExtension = file.Extension;
            _clsImageGDEntity.ImageName = file.Name;
            _clsImageGDEntity.ImageType = 2;
            _clsImageGDEntity.ImagePath = "~/CMSImages/FinalImages/" + lblSelectedBarcode.Content.ToString() + "/" + file.Name;
            _clsImageGDEntity.JabongBarcode = lblSelectedBarcode.Content.ToString();
            _clsImageGDEntity.RoleId = roleID;
            _clsImageGDEntity.TaskID = taskID;
            _clsImageGDEntity.UserID = UserId;
            _clsImageGDEntity.SystemIP = systemIP;
            _clsGdAllotment.clsImageTransactionEntity.Add(_clsImageGDEntity);
            ----- first method calling-----                
           proxy.UploadFinalImageCompleted += (s, e) =>
            {
                if (e.Error == null)
                {

                }     
            };
            proxy.UploadFinalImageAsync(_clsImageEntity);
            countfile = countfile + 1;
            pbUploadFiles.Value = countfile;

        }
        _clsGdAllotment.GdID = int.Parse(lblUserID.Content.ToString());
        _clsGdAllotment.JabongBarcode = lblSelectedBarcode.Content.ToString();
        _clsGdAllotment.TaskID = taskID;
        --- after for loop completion calling second method -----
        _gdDoneOperation.InsertGDDoneInformationCompleted +=      _gdDoneOperation_InsertGDDoneInformationCompleted;
        _gdDoneOperation.InsertGDDoneInformationAsync(_clsGdAllotment);`

緊急を助けてください。

4

2 に答える 2

2

タスクベースの非同期パターンを使用している場合:

var task1 = CallFirstAsyncMethod();
task1.Wait(); // waiting task to finish

var task2 = CallAnotherAsyncMethod();    

// or subscribe to the task continuation to call second
// method when first operation will finished
task1.ContinueWith(t =>
  {
    // add error handling
    var task2 = CallAnotherAsyncMethod();
  });

クラシック非同期パターン(別名APM)を使用している場合:

IAsyncResult ar1 = CallFirstAsyncMethod();
ar1.WaitHandle.Wait();
IAsyncResult ar2 = CallSecondAsyncMethod();

// or use the same technique asynchronously
CallFirstAsyncMethod(ar => // Suppose we should provide appropriate callback
 {
    // Call to appropriate EndInvoke method

    IAsyncResult ar2 = CallSecondAsyncMethod();
 }, state);
于 2012-11-26T11:44:05.507 に答える
0

最初のコールバックで 2 番目を呼び出すことができます。

または、Visual Studio < 2012

AutoResetEventを使用できます。

MyServiceClient clientService;
AutoResetEvent autoResetEvent = new AutoResetEvent(false);
public void Execute()
{
    InvokeCompletedEventArgs data = null;
    clientService.InvokeCompleted += (e, f) =>
    {
        data = f;
        autoResetEvent.Set();
    };
    m_proxy.MyCallAync();
    autoResetEvent.WaitOne(); // Wait the set of autoResetEvent
    m_proxy.MySecondCallAync(data); // Data return by the first call
}

アントワーヌ

于 2012-11-26T15:29:18.147 に答える