Pergunta

Eu estou chamando um pacote SSIS usando LoadPackage (...).

É possível fazer esta chamada uma chamada assíncrona?

Foi útil?

Solução

Sim, usar um delegado assíncrona, como demostrated aqui:

http://msdn.microsoft.com/en-us/library /h80ttd5f.aspx

Outras dicas

Se você só quer que ele seja executado em segundo plano, então sim, você pode enrolar-se um fio ou ligue para algum T-SQL para criar dinamicamente um trabalho (e removê-lo novamente depois). Se você deseja executá-lo de forma assíncrona e quer um retorno de chamada quando ele é feito, então eu acho que você está sem sorte, infelizmente.

Você está perguntando se é 1) legal para chamar LoadPackage em uma discussão de fundo ou 2) é possível. Para # 1 Eu não posso dar uma resposta definitiva porque eu não usar a estrutura SSIS.

No entanto # 2 (desde que # 1 é verdade) é definitivamente factível. IMHO, você é melhor fora de usar uma estrutura existente que tem de API projetado para chamar assíncrono da API e esperar pelos resultados. Por exemplo, com Parellel extensões de 08 de junho CTP, o seguinte código vai fazer.

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

Eu estou chamando um pacote SSIS do meu UI (WPF), através de uma chamada de serviço assíncrono WCF. código de serviço é:

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;
        }
    }
}

E (parte de) o código do lado do cliente é o seguinte:

private void InvokeLoadMarriages()
{
    integrationServicesServiceClient.BeginImportMarriageXML(false, OnEndImportMarriageXML, null);
}

private void OnEndImportMarriageXML(IAsyncResult asyncResult)
{
    view.InvokeDisplayResults(integrationServicesServiceClient.EndImportMarriageXML(asyncResult));
}

Onde BeginImportMarriageXML & EndImportMarriageXML são o gerado assíncrono operações na classe proxy.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top