داعيا حزمة مباحث أمن الدولة بشكل غير متزامن
-
03-07-2019 - |
سؤال
وادعو حزمة SSIS باستخدام LoadPackage (...).
هل من الممكن لجعل هذه الدعوة دعوة غير متزامن؟
المحلول
نعم، استخدم مندوب غير متزامن، كما demostrated هنا:
نصائح أخرى
إذا كنت ترغب فقط ليتم تشغيله في الخلفية ثم نعم، يمكنك إما التخزين المؤقت حتى موضوع أو استدعاء بعض T-SQL لإنشاء مهمة حيوي (وإزالته مرة أخرى بعد ذلك). إذا كنت ترغب في تشغيله بشكل غير متزامن وتريد رد عندما يكون القيام به، ثم اعتقد انك من الحظ للأسف.
وتسأل ما اذا كان 1) قانوني للاتصال LoadPackage على مؤشر ترابط خلفية أو 2) هل من الممكن. ل# 1 لا أستطيع إعطاء إجابة محددة لأنني لا تستخدم إطار جهاز مباحث أمن الدولة.
ولكن رقم 2 (طالما # 1 غير صحيح) غير قابلة للتنفيذ بالتأكيد. IMHO، كنت أفضل حالا باستخدام الإطار القائم الذي لديه المعهد يهدف إلى الدعوة المتزامن API وانتظار النتائج. على سبيل المثال مع Parellel الامتدادات 8 يونيو CTP، فإن البرمجية التالية القيام به.
using System.Threading.Tasks;
...
var future = Future.Create(()=>LoadPackage); // Starts loading the package
// Do other stuff
var package = future.Value; // Wait for package load to complete and get the value
وادعو حزمة مباحث أمن الدولة من وجهة نظري UI (WPF) عن طريق استدعاء خدمة WCF المتزامن. رمز الخدمة هو:
public string ImportMarriageXML(bool isWakeUp, bool clearExistingMarriage)
{
try
{
var dts = new Microsoft.SqlServer.Dts.Runtime.Application();
using (var package = dts.LoadFromSqlServer(
ServiceSettings.Settings.SSIS.ImportMarriages,
ServiceSettings.Settings.SSIS.ServerIP,
ServiceSettings.Settings.SSIS.UserID,
ServiceSettings.Settings.SSIS.Password,
null))
{
package.InteractiveMode = false;
package.Connections["DB.STAGING"].ConnectionString = String.Format("{0};Provider={1};", DBSettings.ConnectionString(Core.Database.Staging), ServiceSettings.Settings.SSIS.Provider);
var variables = package.Variables;
variables["IsWakeUp"].Value = isWakeUp;
variables["ClearExistingMarriage"].Value = clearExistingMarriage;
variables["XmlDirectory"].Value = ServiceSettings.Settings.SSIS.Properties.XmlDirectory;
if (package.Execute() == DTSExecResult.Failure)
{
// HACK: Need to refactor this at some point. Will do for now.
var errors = new System.Text.StringBuilder();
foreach (var error in package.Errors)
errors.AppendFormat("SubComponent: {0}; Description: {1}{2}", error.SubComponent, error.Description, Environment.NewLine);
throw new ApplicationException(errors.ToString());
}
return package.Connections["Text Logging"].ConnectionString;
}
}
}
و(جزء من) رمز العميل هو كما يلي:
private void InvokeLoadMarriages()
{
integrationServicesServiceClient.BeginImportMarriageXML(false, OnEndImportMarriageXML, null);
}
private void OnEndImportMarriageXML(IAsyncResult asyncResult)
{
view.InvokeDisplayResults(integrationServicesServiceClient.EndImportMarriageXML(asyncResult));
}
وأين BeginImportMarriageXML وEndImportMarriageXML هي عمليات المتزامن ولدت في فئة الوكيل.